Pandas - DataFrame, 사칙연산

Soogyung Gwon·2026년 1월 27일

구름을잡아라

목록 보기
7/60

판다스는 엑셀의 파이썬 버전!

범주기능
구조Series, DataFrame
입출력read / to
선택loc / iloc
정제결측, 타입
변환apply, map
집계groupby
결합merge, concat
시계열rolling, ewm
범주형category
요약describe

표 = DataFrame

import pandas as pd

DataFrame의 생성 방법

1) 리스트 전달

users = [
    ['철수', 180, 5], 
    ["민수", 170, 5],
    ["짱구", 130, 5]
]

dfUsers = pd.DataFrame(users)
dfUsers

	0	1	2
0	철수	180	5
1	민수	170	5
2	짱구	130	5

2) 딕셔너리 전달

users = {
    "name" : ['철수', "민수", "짱구"],
    "height" : [180, 170, 130],
    "age" : [25, 30, 5]
}

dfUsers = pd.DataFrame(users)
dfUSers

	name	height	age
0	철수	180	25
1	민수	170	30
2	짱구	130	5

3) 리스트 in 딕셔너리 전달

users = [
    {"name" : "철수", "height" : 180, "age" : 25},
    {"name" : "민수", "height" : 170, "age" : 30},
    {"name" : "짱구", "height" : 130, "age" : 5}
]

users

dfUsers = pd.DataFrame(users)
dfUsers

	name	height	age
0	철수		180		25
1	민수		170		30
2	짱구		130		5

사칙연산

  • 같은 라벨(index / column)끼리만 계산한다
  • DataFrame도 행과 열이 다 맞아야 계산됨, 안 맞는 경우 NaN

덧셈

df.add(other, axis='columns', level=None, fill_value=None)

뺄셈

df.sub(other, axis='columns', level=None, fill_value=None)

곱셈

df.mul(other, axis='columns', level=None, fill_value=None)

곱셈에서 fillvalue를 0으로 하는 경우, 값들이 전부 0이 되버리므로 그냥 fill_value를 쓰지 않는다 (가장 일반적)
대신 fill_value=1을 사용하는 경우가 있고, 아래와 같이 쓰는 경우가 있다.
df1.mul(df2).fillna(0)

  • 연산 결과가 NaN인 경우만 최종 출력에서 0으로
    그러나 fill_value=0이 맞는 경우도 있기에 주의 (겹치는 항목만 의미있고 나머지는 0, sparse matrix 계산 등)

나눗셈

df.div(other, axis='columns', level=None, fill_value=None)

판다스에서 div로 0으로 나누면 -> 에러가 아니라 inf(infinity) 또한 NaN이 나온다.
IEEE 754 부동소수점 규칙

계산결과
양수 / 0inf
음수 / 0-inf
0 / 0NaN
NaN / 0NaN

실무에서 사용하는 패턴:

result = df1.div(df2)
result = result.replace([np.inf, -np.inf], np.nan)

#혹은

df1.div(df2.where(df2 != 0))

axis가 의미하는 것

axis=0 또는 'index' - 행 기준 (index에 맞춰 연산)
axis=1 또는 'columns' - 열 기준 (column에 맞춰 연산)

rXXX = 피연산자 순서를 뒤집은 연산

호출 시점:
A + B → A.add(B)
B + A → A.radd(B)

사용이유:
연산 방향을 명확히 표현하고 싶을 때
코드 리뷰 / 가독성 중시
10 - df 같은 표현을 메서드로 쓸 때

덧셈/곱셈은 결과 같아 보여도 뺄셈/나눗셈은 의미가 완전히 다르다

나머지

df.mod(other, axis='columns', level=None, fill_value=None)

연산fill_value=0 결과
add0 + x → x
mul0 × x → 0
divx / 0 → inf
modx % 0 → NaN

]

mod는 0을 만나면 무조건 의미가 깨진다

  • mod에서는 fill_value=0 거의 안 씀
  • 분모를 먼저 정제 (정석)
    s1.mod(s2.where(s2 != 0))
  • 결과 기준으로 처리
    result = s1.mod(s2)
    result = result.fillna(0) # 의도가 명확할 때만
profile
오랜시간 망설였던 코딩을 다시 해보려고 노력하고 있는 사람

0개의 댓글