반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- Github
- Tkinter
- array
- GIT
- PostgreSQL
- google apps script
- string
- Redshift
- dataframe
- PANDAS
- c#
- numpy
- gas
- SQL
- math
- PySpark
- Kotlin
- Google Excel
- Google Spreadsheet
- hive
- django
- 파이썬
- matplotlib
- Excel
- list
- Mac
- Apache
- Java
- Python
Archives
- Today
- Total
달나라 노트
Python Pandas : div (나눗셈) 본문
728x90
반응형
Pandas div() — axis와 fill_value로 나눗셈 방향과 결측치를 제어하는 메서드
div()는 DataFrame의 element-wise 나눗셈 메서드입니다. / 연산자와 기본 동작은 같지만, axis와 fill_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
반응형
'Python > Python Pandas' 카테고리의 다른 글
| Python Pandas : map (0) | 2026.05.20 |
|---|---|
| Python Pandas : agg (열마다 다른 집계함수 적용) (0) | 2026.05.20 |
| Python Pandas : std() — 표준편차를 계산하는 메서드 (0) | 2026.05.14 |
| Python Pandas : Series .values vs .to_numpy() (0) | 2026.05.14 |
| Python Pandas : where & mask (값 필터링하여 바꾸기) (0) | 2026.05.12 |
Comments
