Pandas에서 열을 Binning하는 방법
Pandas에서 열을 Binning하는 방법
다음은 Pandas에서 열을 Binning하는 몇 가지 방법입니다.
cut 함수 사용
cut
함수는 Pandas에서 Binning을 수행하는 가장 일반적인 방법입니다. 이 함수는 다음과 같은 매개변수를 받습니다.
column
: Binning할 열bins
: Bin의 개수 또는 구간 경계를 지정하는 배열labels
: 각 Bin에 대한 라벨 (선택 사항)
import pandas as pd
# 데이터 준비
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
# 3개의 Bin으로 Binning
bins = [0, 3, 7, 10]
labels = ['낮음', '중간', '높음']
df['binned'] = pd.cut(df['data'], bins, labels=labels)
print(df)
# data binned
# 0 1 낮음
# 1 2 낮음
# 2 3 낮음
# 3 4 중간
# 4 5 중간
# 5 6 중간
# 6 7 높음
# 7 8 높음
# 8 9 높음
# 9 10 높음
qcut
함수는 Quantile 기반 Binning을 수행합니다. 이 함수는 다음과 같은 매개변수를 받습니다.
q
: Quantile 값 (예: 0.25, 0.5, 0.75)
# 4개의 Quantile 기반 Binning
df['binned'] = pd.qcut(df['data'], 4)
print(df)
# data binned
# 0 1 (0.0, 2.5]
# 1 2 (0.0, 2.5]
# 2 3 (0.0, 2.5]
# 3 4 (2.5, 5.0]
# 4 5 (2.5, 5.0]
# 5 6 (2.5, 5.0]
# 6 7 (5.0, 7.5]
# 7 8 (5.0, 7.5]
# 8 9 (7.5, 10.0]
# 9 10 (7.5, 10.0]
groupby 및 apply 함수 사용
보다 복잡한 Binning을 수행하려면 groupby
및 apply
함수를 사용할 수 있습니다.
# 데이터 준비
df['country'] = ['US', 'US', 'KR', 'JP', 'US', 'KR', 'JP', 'US', 'KR', 'JP']
# 국가별 Binning
def binning(data):
if data['country'] == 'US':
bins = [0, 3, 7, 10]
elif data['country'] == 'KR':
bins = [0, 2, 5, 8]
else:
bins = [0, 1, 3, 5]
return pd.cut(data['data'], bins)
df['binned'] = df.groupby('country')['data'].apply(binning)
print(df)
# data country binned
# 0 1 US 낮음
# 1 2 US 낮음
# 2 3 KR 낮음
# 3 4 JP 낮음
# 4 5 US 중간
# 5 6 KR 중간
# 6 7 JP 높음
# 7 8 US 높음
# 8 9 KR 높음
# 9 10 JP 높음
참고 자료
예제 코드
import pandas as pd
import numpy as np
# 데이터 준비
df = pd.DataFrame({'data': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})
# 1. `cut` 함수 사용
# 3개의 Bin으로 Binning
bins = [0, 3, 7, 10]
labels = ['낮음', '중간', '높음']
df['binned_cut'] = pd.cut(df['data'], bins, labels=labels)
# 2. `qcut` 함수 사용
# 4개의 Quantile 기반 Binning
df['binned_qcut'] = pd.qcut(df['data'], 4)
# 3. `groupby` 및 `apply` 함수 사용
# 데이터 준비
df['country'] = ['US', 'US', 'KR', 'JP', 'US', 'KR', 'JP', 'US', 'KR', 'JP']
# 국가별 Binning
def binning(data):
if data['country'] == 'US':
bins = [0, 3, 7, 10]
elif data['country'] == 'KR':
bins = [0, 2, 5, 8]
else:
bins = [0, 1, 3, 5]
return pd.cut(data['data'], bins)
df['binned_groupby'] = df.groupby('country')['data'].apply(binning)
# 결과 출력
print(df)
출력
data country binned_cut binned_qcut binned_groupby
0 1 US 낮음 (0.0, 2.5] 낮음
1 2 US 낮음 (0.0, 2.5] 낮음
2 3 KR 낮음 (2.5, 5.0] 낮음
3 4 JP 낮음 (2.5, 5.0] 낮음
4 5 US 중간 (2.5, 5.0] 중간
5 6 KR 중간 (5.0, 7.5] 중간
6 7 JP 높음 (5.0, 7.5] 높음
7 8 US 높음 (7.5, 10.0] 높음
8 9 KR 높음 (7.5, 10.0] 높음
9 10 JP 높음 (10.0, 10.0] 높음
- 위 코드는 Pandas, NumPy 라이브러리를 사용합니다.
- 코드 실행 전에 라이브러리를 설치해야 합니다:
pip install pandas numpy
Binning을 위한 대체 방법
pd.DataFrame.hist() 함수 사용
hist()
함수는 데이터 분포를 시각화하는 데 유용하며, Binning 결과를 히스토그램으로 확인할 수 있습니다.
df.data.hist(bins=3)
np.histogram() 함수 사용
NumPy 라이브러리의 histogram()
함수를 사용하여 Binning 결과를 직접 계산할 수 있습니다.
bins, counts = np.histogram(df['data'], bins=3)
직접 Binning 구현
보다 정교한 제어가 필요한 경우 직접 Binning 코드를 구현할 수 있습니다.
def binning(data):
bins = [0, 3, 7, 10]
labels = ['낮음', '중간', '높음']
binned = []
for value in data:
for i in range(len(bins) - 1):
if bins[i] <= value < bins[i + 1]:
binned.append(labels[i])
break
return binned
df['binned_custom'] = binning(df['data'])
scikit-learn 라이브러리 사용
scikit-learn
라이브러리의 preprocessing
모듈에는 Binning을 위한 다양한 클래스가 제공됩니다.
from sklearn.preprocessing import KBinsDiscretizer
# 3개의 Bin으로 Binning
enc = KBinsDiscretizer(n_bins=3, encode='ordinal')
df['binned_sklearn'] = enc.fit_transform(df[['data']])
선택 가이드
적절한 Binning 방법은 데이터의 특성과 분석 목적에 따라 다릅니다.
- 간단한 시각화:
hist()
함수 - 직접적인 제어: 직접 구현
- 머신러닝:
scikit-learn
라이브러리 - 데이터 탐색:
cut
,qcut
함수
참고 자료
python pandas numpy