[Python pandas] GroupBy로 그룹별로 반복 작업하기 (Iteration over groups)
Python 분석과 프로그래밍/Python 데이터 전처리 2018. 8. 26. 19:35이번 포스팅에서는 GroupBy 를 사용하여 그룹별로 반복 작업(iteration over groups)하는 방법을 소개하겠습니다.
pandas의 GroupBy 객체는 for loop 반복 시에 그룹 이름과 그룹별 데이터셋을 2개의 튜플로 반환합니다. 이러한 특성을 잘 활용하면 그룹별로 for loop 반복작업을 하는데 유용하게 사용할 수 있습니다.
[ GroupBy로 그룹별로 반복 작업하기 ]
예제로 사용할 데이터는 UCI machine learning repository에 등록되어 있는 abalone 공개 데이터셋입니다.
- abalone text file download: abalone.txt
import numpy as np import pandas as pd abalone = pd.read_csv("/Users/ihongdon/Documents/Python/abalone.txt", sep=",", names = ['sex', 'length', 'diameter', 'height', 'whole_weight', 'shucked_weight', 'viscera_weight', 'shell_weight', 'rings'], header = None) abalone['length_cat'] = np.where(abalone.length > np.median(abalone.length), 'length_long', 'length_short') abalone.head()
|
위의 abalone 데이터셋을 '성별(sex)'로 GroupBy를 한 후에, for loop을 돌려서 그룹 이름(sex: 'F', 'I', 'M')별로 데이터셋을 프린트해보겠습니다.
for sex, group_data in abalone[['sex', 'length_cat', 'whole_weight', 'rings']].groupby('sex'): print sex, print group_data[:5]
F sex length_cat whole_weight rings
I sex length_cat whole_weight rings 4 I length_short 0.2050 7 5 I length_short 0.3515 8 16 I length_short 0.2905 7 21 I length_short 0.2255 10 42 I length_short 0.0700 5 M sex length_cat whole_weight rings
0 M length_short 0.5140 15
1 M length_short 0.2255 7
3 M length_short 0.5160 10
8 M length_short 0.5095 9
11 M length_short 0.4060 10 |
이번에는 두 개의 범주형 변수(sex, length_cat)를 사용하여 for loop 반복문으로 그룹 이름 (sex와 leggth_cat 의 조합: F & length_long, F & length_short, I & length_long, I & length_short, M & length_long, M & length_short)과 각 그룹별 데이터셋을 프린트해보겠습니다.
참고로, 아래 코드에서 '\' 역슬래쉬는 코드를 한줄에 전부 다 쓰기에 너무 길 때 다음줄로 코드를 넘길 때 사용합니다.
for (sex, length_cat), group_data in abalone[['sex', 'length_cat', 'whole_weight', 'rings']]\ .groupby(['sex', 'length_cat']): print sex, length_cat print group_data[:5]
F length_long
sex length_cat whole_weight rings
9 F length_long 0.8945 19
22 F length_long 0.9395 12
23 F length_long 0.7635 9
24 F length_long 1.1615 10
25 F length_long 0.9285 11 F length_short
sex length_cat whole_weight rings
2 F length_short 0.6770 9
6 F length_short 0.7775 20
7 F length_short 0.7680 16
10 F length_short 0.6065 14
13 F length_short 0.6845 10 I length_long
sex length_cat whole_weight rings
509 I length_long 0.8735 16
510 I length_long 1.1095 10
549 I length_long 0.8750 11
550 I length_long 1.1625 17
551 I length_long 0.9885 13 I length_short
sex length_cat whole_weight rings
4 I length_short 0.2050 7
5 I length_short 0.3515 8
16 I length_short 0.2905 7
21 I length_short 0.2255 10
42 I length_short 0.0700 5 M length_long
sex length_cat whole_weight rings
27 M length_long 0.9310 12
28 M length_long 0.9365 15
29 M length_long 0.8635 11
30 M length_long 0.9975 10
32 M length_long 1.3380 18 M length_short
sex length_cat whole_weight rings
0 M length_short 0.5140 15
1 M length_short 0.2255 7
3 M length_short 0.5160 10
8 M length_short 0.5095 9
11 M length_short 0.4060 10 |
다음으로, 성별(sex)로 GroupBy를 해서 성별 그룹('F', 'I', 'M')을 key로 하고, 데이터셋을 value로 하는 dict를 만들어보겠습니다.
abalone_sex_group = dict(list(abalone[:10][['sex', 'length_cat', 'whole_weight', 'rings']] .groupby('sex')))
abalone_sex_group {'F': sex length_cat whole_weight rings
2 F length_short 0.6770 9
6 F length_short 0.7775 20
7 F length_short 0.7680 16
9 F length_long 0.8945 19, 'I': sex length_cat whole_weight rings
4 I length_short 0.2050 7
5 I length_short 0.3515 8, 'M': sex length_cat whole_weight rings
0 M length_short 0.5140 15
1 M length_short 0.2255 7
3 M length_short 0.5160 10
8 M length_short 0.5095 9} |
이렇게 그룹 이름을 key로 하는 dict 를 만들어놓으면 그룹 이름을 가지고 데이터셋을 indexing하기에 편리합니다. 예로 성별 중에 'M'인 데이터셋을 indexing해보겠습니다.
abalone_sex_group['M']
|
물론 abalone[:10][abalone['sex'] == 'M'] 처럼 원래의 처음 abalone 데이터프레임에 boolean 형태로 indexing을 해도 됩니다. 대신에 dict 로 만들어놓으면 데이터셋 indexing 하는 속도가 더 빠를겁니다.
많은 도움이 되었기를 바랍니다.
'Python 분석과 프로그래밍 > Python 데이터 전처리' 카테고리의 다른 글
[Python pandas] 데이터프레임에서 두 개의 문자열 변수의 각 원소를 합쳐서 새로운 변수 만들기 (2) | 2018.09.01 |
---|---|
[Python pandas] 범주형 변수의 항목을 기준 정보를 사용하여 매핑해 변환하기: dict.get() (0) | 2018.08.31 |
[Python pandas] groupby() 로 그룹별 집계하기 (data aggregation by groups) (8) | 2018.08.26 |
[Python pandas] 다수개의 범주형자료로 가변수 만들기 (dummy variable) (2) | 2018.08.21 |
[Python NumPy] 선형대수 함수 (Linear Algebra) (0) | 2018.08.15 |