-
Chapter 11-3~11-4 데이터 필터링, 그룹 오브젝트Do it! 판다스 입문 2022. 6. 25. 18:59
만약 그룹화한 데이터에서 원하는 데이터를 걸러내고 싶다면 어떻게 해야 할까요? 그럴 때는 데이터 필터링을 사용하면 됩니다. 데이터 필터링을 사용하면 기준에 맞는 데이터를 걸러낼 수 있습니다. 다음 예제를 통해 데이터 필터링이 무엇인지 알아보겠습니다.
데이터 필터링 사용하기 - filter 메서드
1. 다음과 같이 tips 데이터 집합을 불러와 데이터 크기를 확인합니다.
tips = sns.load_dataset('tips')
print(tips.shape)
(244, 7)2. size 열의 데이터 수를 확인해 보면 1, 5, 6 테이블의 주문이 매우 적다는 것을 알 수 있습니다.
print(tips['size'].value_counts( ))
2 156
3 38
4 37
5 5
6 4
1 4
Name: size, dtype: int643. 상황에 따라 이런 데이터는 제외하기도 합니다. 만약 30번 이상의 주문이 있는 테이블만 추려 데이터 분석을 하려면 어떻게 해야 할까요? 다음은 30번 이상의 주문이 있는 테이블만 그룹화하여 변수 tips_filtered에 저장한 것입니다.
tips_filtered = tips.\
groupby('size').\
filter(lambda x: x['size'].count( ) >= 30)4. 과정 3을 거치고 나면 1, 5, 6 테이블의 데이터가 제외되었다는 것을 알 수 있습니다.
print(tips_filtered.shape)
(231, 7)
print(tips_filtered['size'].value_counts( ))
2 156
3 38
4 37
Name: size, dtype: int64그룹 오브젝트 살펴보기
지금까지는 groupby 메서드에 바로 집계 메서드를 사용하여 결과를 확인했습니다. 즉, groupby 메서드가 반환하는 값인 그룹 오브젝트에 대해서는 언급하지 않았습니다. 이번에는 groupby 메서드의 결괏값인 그룹 오브젝트를 자세히 살펴보겠습니다.
그룹 오브젝트 저장하여 살펴보기
1. 다음은 tips 데이터 집합에서 임의로 10개의 데이터를 추출한 것입니다.
tips_10 = sns.load_dataset('tips').sample(10, random_state=42)
print(tips_10)
total_bill tip sex smoker day time size
24 19.82 3.18 Male No Sat Dinner 2
6 8.77 2.00 Male No Sun Dinner 2
153 NaN 2.00 Male No Sun Dineer 4
211 NaN 5.16 Male Yes Sat Dinner 4
198 NaN 2.00 Female Yes Thur Lunch 2
176 NaN 2.00 Male Yes Sun Dinner 2
192 28.44 2.56 Male Yes Thur Lunch 2
124 12.48 2.52 Female No Thur Lunch 2
9 14.78 3.23 Male No Sun Dinner 2
101 15.38 3.00 Female Yes Fri Dinner 22. groupby 메서드의 결괏값을 출력하면 자료형이 그룹 오브젝트라는 것을 확인할 수 있습니다.
grouped = tips_10.groupby('sex')
print(grouped)
<pandas.core.groupby.DataFrameGroupBy object at 0x11286e128>3. 그룹 오브젝트에 포함된 그룹을 보려면 groups 속성을 출력하면 됩니다. 그러면 sex 열로 그룹화한 데이터프레임의 인덱스를 확인할 수 있습니다. 이 그룹 오브젝트로 집계, 변환, 필터 작업을 수행하면 되는 것이죠.
print(grouped.groups)
{'Male': Int64Index([24, 6, 153, 211, 176, 192, 9], dtype='int64'), 'Female': Int64Index([198, 124, 101], dtype='int64')}한 번에 그룹 오브젝트 계산하기
바로 앞의 실습에서 구한 그룹 오브젝트(grouped)는 smoker, day, time 열과 같은 평균값을 구할 수 없는 열도 포함하고 있습니다. 이런 그룹 오브젝트에 mean 메서드와 같은 집계 메서드를 사용하면 어떻게 될까요? 오류가 발생할까요? 아닙니다! 다행히 파이썬은 자동으로 계산할 수 있는 열을 골라주는 기능을 제공합니다. 따라서 그룹 오브젝트에 mean 메서드를 사용해도 바로 평균값을 구할 수 있습니다.
그룹 오브젝트의 평균 구하기
1. 일단 앞에서 만든 그룹 오브젝트(grouped)를 이용하여 평균을 구해 보겠습니다. 그러면 tips 데이터 집합의 모든 열의 평균을 구한 것이 아니라 total_bill, tip size 열의 평균을 구했다는 것을 알 수 있습니다.
avgs = grouped.mean( )
print(avgs)
total_bill tip size
sex
Male 20.02 2.875714 2.571429
Female 13.62 2.506667 2.0000002. tips 데이터 집합의 열을 확인해 보면 평균값을 계산할 수 없는 열인 smoker, day, time 열은 그룹 연산에서 제외되었다는 것을 알 수 있습니다. 이처럼 파이썬은 그룹 연산에 적합한 열을 알아서 골라줍니다.
print(tips_10.columns)
Index(['total_bill', 'tip', 'sex', 'smoker', 'day', 'time', 'size'],
dtype='object)그룹 오브젝트 활용하기
이번에는 그룹 오브젝트를 좀 더 다양하게 활용하는 방법에 대해 알아보겠습니다. 그룹 오브젝트를 활용하는 방법은 아주 많습니다. 여기에서 실습을 통해 소개할 내용은 그룹 오브젝트에서 '데이터 추출하기'와 '반복문 사용하기'입니다. 만약 그룹 오브젝트를 활용하는 방법을 더 알고 싶다면 다음 웹 사이트를 참고하세요.
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html 그룹 오브젝트에서 데이터 추출하고 반복하기
1. 만약 그룹 오브젝트에서 특정 데이터만 추출하려면 get_group 메서드를 사용하면 됩니다. 다음은 sex 열로 그룹화한 그룹 오브젝트에 get_group 메서드를 사용하여 성별이 여성인 데이터만 추출한 것입니다.
female = grouped.get_group('Female')
print(female)
total_bill tip sex smoker day time size
198 13.00 2.00 Female Yes Thur Lunch 2
124 12.48 2.52 Female No Thur Lunch 2
101 15.38 3.00 Female Yes Fri Dinner 22. 이번에는 그룹 오브젝트를 반복문에 사용해 보겠습니다. sex 열을 기준으로 그룹화한 tips 데이터 집합은 여성 그룹과 남성 그룹으로 나누어져 있습니다. 이 특징을 이용하여 반복문을 사용하면 됩니다. 다음은 각 성별 그룹의 데이터를 반복문을 이용하여 출력한 것입니다.
for sex_group in grouped:
print(sex_group)
('Male', total_bill tip sex smoker day time size
24 19.82 3.18 Male No Sat Dinner 2
6 8.77 2.00 Male No Sun Dinner 2
153 24.55 2.00 Male No Sun Dinner 4
...
9 14.78 3.23 Male No Sun Dinner 2)
('Female', total_bill tip sex smoker day time size
198 13.00 2.00 Female Yes Thur Lunch 2
124 12.48 2.52 Female No Thur Lunch 2
101 15.38 3.00 Female Yes Fri Dinner 2)3. 그런데 과정 2의 결과를 자세히 살펴보면 sex_group으로 넘어온 값이 튜플이라는 것을 알 수 있습니다. 다음은 sex_group의 자세한 정보를 출력한 것입니다.
for sex_group in grouped:
print('the type is: {}\n'.format(type(sex_group)))
print('the length is : {}\n'.format(len(sex_group)))
first_element = sex_group[0]
print('the first element is: {}\n'.format(first_element))
print('it has a type of: {}\n'.format(type(sex_group[0])))
second_element = sex_group[1]
print('the second element is:\n'.format(second_element))
print('it has a type of: {}\m'.format(type(second_element)))
print('what we have:')
print(sex_group)
break
the type is: <class 'tuple'>
the length is: 2
the first element is: Male
it has a type of: <class 'str'>
the second element is:
total_bill tip sex smoker day time size
24 19.82 3.18 Male No Sat Dinner 2
6 8.77 2.00 Male No Sun Dinner 2
153 24.55 2.00 Male No Sun Dineer 4
211 25.89 5.16 Male Yes Sat Dinner 4
176 17.89 2.00 Male Yes Sun Dinner 2
192 28.44 2.56 Male Yes Thur Lunch 2
9 14.78 3.23 Male No Sun Dinner 2
it has a type of: <class 'pandas.core.frame.DataFrame'>
what we have:
('Male', total_bill tip sex smoker day time size
24 19.82 3.18 Male No Sat Dinner 2
6 8.77 2.00 Male No Sun Dinner 2
153 24.55 2.00 Male No Sun Dinner 4
211 25.89 5.16 Male Yes Sat Dinner 4
176 17.89 2.00 Male Yes Sun Dinner 2
192 28.44 2.56 Male Yes Thur Lunch 2
9 14.78 3.23 Male No Sun Dinner 2)여러 열을 사용해 그룹 오브젝트 만들고 계산하기
지금까지는 하나의 열을 사용하여 그룹 오브젝트를 만들고 연산을 수행했습니다. 하지만 여러 열을 사용하여 그룹 오브젝트를 만들고 평균값을 구하는 등의 계산도 할 수 있습니다.
그룹 오브젝트 계산하고 살펴보기
1. 여러 열을 사용하여 데이터를 그룹화하려면 리스트에 열 이름을 담아 groupby 메서드에 전달하면 됩니다. 다음은 sex, time 열을 기준으로 데이터를 그룹화하고 평균값을 구한 것입니다.
bill_sex_time = tips_10.groupby(['sex', 'time'])
group_avg = bill_sex_time.mean( )
print(group_avg)
total_bill tip size
sex time
Male Lunch 28.440000 2.560000 2.000000
Dinner 18.616667 2.928333 2.666667
Female Lunch 12.740000 2.260000 2.000000
Dinner 15.380000 3.000000 2.0000002. 과정 1을 거친 group_avg의 자료형을 확인해 보면 데이터프레임이라는 것을 알 수 있습니다. 그리고 변수 group_avg에 포함된 열은 total_bill, tip, size라는 것도 알 수 있습니다.
print(type(group_avg))
<class 'pandas.core.frame.DataFrame'>
print(group_avg.columns)
Index(['total_bill', 'tip', 'size'], dtype='object')3. group_avg의 자료형은 데이터프레임이라고 했습니다. 그러면 인덱스는 어떻게 구성되어 있을까요? 다음은 group_avg의 인덱스를 출력한 것입니다.
print(group_avg.index)
MultiIndex(levels=[['Male', 'Female'], ['Lunch', 'Dinner']],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['sex', 'time'])4. 과정 3과 같이 데이터프레임의 인덱스가 MultiIndex인 경우에는 reset_index 메서드를 사용하여 데이터프레임의 인덱스를 새로 부여할 수도 있습니다.
group_method = tips_10.groupby(['sex', 'time']).mean( ).reset_index( )
print(group_method)
sex time total_bill tip size
0 Male Lunch 28.440000 2.560000 2.000000
1 Male Dinner 18.616667 2.928333 2.666667
2 Female Lunch 12.740000 2.260000 2.000000
3 Female Dinner 15.380000 3.000000 2.0000005. reset_index 메서드 대신 as_index 인자를 False로 설정해도 과정 4와 같은 결과를 얻을 수 있습니다.
group_param = tips_10.groupby(['sex', 'time'], as_index=False).mean( )
print(group_param)
sex time total_bill tip size
0 Male Lunch 28.440000 2.560000 2.000000
1 Male Dinner 18.616667 2.928333 2.666667
2 Female Lunch 12.740000 2.260000 2.000000
3 Female Dinner 15.380000 3.000000 2.000000마무리하며
이 장에서는 groupby 메서드의 분리-반영-결합 과정을 구체적으로 살펴보고 데이터를 집계, 변환, 필터링하는 방법을 알아보았습니다. 또 여러 가지 방법으로 그룹 오브젝트를 만들고 계산하는 방법도 알아보았습니다. 데이터를 그룹화하여 계산하는 작업은 실무에서 자주 사용하므로 반드시 알아두어야 합니다.
출처 : "판다스 입문"
'Do it! 판다스 입문' 카테고리의 다른 글
Chapter 12-2 사례별 시계열 데이터 계산하기_1 (0) 2022.06.26 Chapter 12-1 datetime 오브젝트 (0) 2022.06.26 Chapter 11-1~11-2 데이터 집계, 데이터 변환 (0) 2022.06.25 Chapter 10 apply 메서드 활용 (0) 2022.06.25 Chapter 09-3~09-4 문자열 포매팅, 정규식으로 문자열 처리에 날개 달기 (0) 2022.06.25