달나라 노트

Python Pandas : div (나눗셈) 본문

Python/Python Pandas

Python Pandas : div (나눗셈)

CosmosProject 2026. 5. 20. 21:47
728x90
반응형

Pandas div() — axis와 fill_value로 나눗셈 방향과 결측치를 제어하는 메서드

div()는 DataFrame의 element-wise 나눗셈 메서드입니다. / 연산자와 기본 동작은 같지만, axisfill_value 파라미터로 행/열 방향 제어와 결측치 처리가 가능합니다.

기본 문법

DataFrame.div(other, axis='columns', fill_value=None)
파라미터 설명
other 나눌 값 (스칼라, Series, DataFrame)
axis 0/'index' 또는 1/'columns' (기본값 1)
fill_value 연산 전 NaN을 대체할 값 (기본값 None)

스칼라 나눗셈

import pandas as pd

df = pd.DataFrame({
    '국어': [80, 60, 90],
    '수학': [70, 85, 95]
})

df.div(100)
#    국어  수학
# 0  0.80  0.70
# 1  0.60  0.85
# 2  0.90  0.95

Series로 나눗셈 — axis가 핵심

Series를 기준으로 나눌 때 axis 방향을 반드시 지정해야 합니다.

df:              total (행별 합계):
   국어  수학
0   80   70      0    150
1   60   85      1    145
2   90   95      2    185
total = df.sum(axis=1)   # 행별 합계 → Series [150, 145, 185]

# axis=0: Series 인덱스를 행에 맞춰 정렬 → 각 행을 해당 총점으로 나눔
df.div(total, axis=0)
#        국어      수학
# 0  0.5333    0.4667
# 1  0.4138    0.5862
# 2  0.4865    0.5135

# axis=1 (기본): Series 인덱스를 열에 맞춰 정렬
# → '국어', '수학' 라벨이 없으면 NaN 발생
df.div(total, axis=1)   # 대부분 NaN
axis 선택 기준: 행별 합계로 나눌 때는 axis=0, 열별 합계로 나눌 때는 axis=1. 비율 계산은 거의 항상 axis=0입니다.

fill_value — NaN 자리를 채우고 연산

DataFrame끼리 나눌 때 한쪽에만 NaN이 있으면 fill_value로 채운 뒤 연산합니다. 양쪽 모두 NaN이면 여전히 NaN입니다.

a = pd.DataFrame({'A': [10, None], 'B': [20, 30]})
b = pd.DataFrame({'A': [2,  4],    'B': [None, 6]})

a.div(b)
#      A         B
# 0  5.0       NaN   ← b의 B[0]이 NaN → 결과도 NaN
# 1  NaN       5.0   ← a의 A[1]이 NaN → 결과도 NaN

a.div(b, fill_value=1)   # NaN을 1로 채운 뒤 연산
#      A         B
# 0  5.0      20.0   ← b의 B[0]을 1로 채워서 20/1
# 1  NaN       5.0   ← a의 A[1]은 NaN 유지 (둘 다 NaN이면 적용 안 됨)

응용 사례 1 — 행별 비율 계산

scores = pd.DataFrame({
    '국어': [80, 60, 90],
    '수학': [70, 85, 95],
    '영어': [75, 80, 88]
}, index=['철수', '영희', '민준'])

total = scores.sum(axis=1)
ratio = scores.div(total, axis=0).round(3)
#        국어    수학    영어
# 철수  0.356  0.311  0.333
# 영희  0.267  0.378  0.356
# 민준  0.329  0.347  0.321

응용 사례 2 — 열별 최댓값으로 정규화

col_max = scores.max(axis=0)                   # 열별 최댓값
normalized = scores.div(col_max, axis=1)       # axis=1: 열 방향 정렬
#         국어       수학       영어
# 철수  0.8889    0.7368    0.8523
# 영희  0.6667    0.8947    0.9091
# 민준  1.0000    1.0000    1.0000

응용 사례 3 — 전월 대비 증감률

sales = pd.DataFrame({
    '서울': [100, 120, 110],
    '부산': [80,   75,  90]
}, index=['1월', '2월', '3월'])

# 현재 / 이전 → 전월 대비 비율
growth = sales.div(sales.shift(1)).round(3)
#        서울   부산
# 1월     NaN    NaN   ← 이전 달 없음
# 2월    1.20   0.938
# 3월    0.917  1.200

응용 사례 4 — 카테고리별 매출 비중

data = pd.DataFrame({
    '식품': [200, 180, 220],
    '전자': [500, 620, 480]
}, index=['1월', '2월', '3월'])

row_total = data.sum(axis=1)
share = data.div(row_total, axis=0).mul(100).round(1)
#     식품    전자
# 1월  28.6   71.4
# 2월  22.5   77.5
# 3월  31.4   68.6

div() vs / 연산자

df / other df.div(other)
axis 지정 불가 가능
fill_value 지정 불가 가능
Series로 행별 나눗셈 불가 (NaN 발생) axis=0으로 가능
핵심 직관: axis=0은 "각 행마다 Series 값 하나씩 대응", axis=1은 "각 열마다 Series 값 하나씩 대응"입니다. / 대신 div()를 써야 하는 순간은 행 방향(axis=0) 연산이 필요할 때입니다.
728x90
반응형
Comments