[Pandas 기초] 데이터프레임의 필터링(filtering)
업데이트:
개요
파이썬의 내장함수인 filter
함수가 궁금했다면 내장함수포스팅을 참고하자
데이터프레임에서 원하는 조건에 해당하는 데이터만 가져오고 싶을때가 많이 있다. 필터링을 하는 방법은 다양하지만 이번 포스팅에서는 자주 사용되는 두가지만 살펴보도록 하자.
불린 인덱싱(boolean indexing)
DataFrame객체[불린 시리즈]
시리즈 객체에 어떤 조건식을 적용하면 각 원소에 대해 참/거짓을 판별하여 불린(참, 거짓)값으로 구성된 시리즈를 반환한다.
이 값들을 다시 데이터프레임에 적용하면, 참(True)에 해당하는 값을 필터링 할 수 있는 원리이다.
타이타닉 데이터의 age열이 10이상 20미만인 행(row)들만 필터링해보자.
import seaborn as sns
titanic = sns.load_dataset('titanic')
mask1 = (titanic.age >= 10) & (titanic.age < 20)
df_teenage = titanic.loc[mask1,:]
print(df_teenage.head())
[Output]
survived pclass sex age sibsp parch fare embarked class \
9 1 2 female 14.0 1 0 30.0708 C Second
14 0 3 female 14.0 0 0 7.8542 S Third
22 1 3 female 15.0 0 0 8.0292 Q Third
27 0 1 male 19.0 3 2 263.0000 S First
38 0 3 female 18.0 2 0 18.0000 S Third
who adult_male deck embark_town alive alone
9 child False NaN Cherbourg yes False
14 child False NaN Southampton no True
22 child False NaN Queenstown yes True
27 man True C Southampton no False
38 woman False NaN Southampton no False
위에서 mask1변수는 불린시리즈(True/False)를 가지고 있는 객체이고, 이를 데이터프레임에 인덱싱으로 활용했다.
마찬가지의 방법으로 age가 10미만이면서, sex가 feamale인 행들만 필터링해보자
mask2 = (titanic.age < 10) & (titanic.sex == 'female')
df_female_under10 = titanic.loc[mask2, :]
print(df_female_under10.head())
[Output]
survived pclass sex age sibsp parch fare embarked class \
10 1 3 female 4.0 1 1 16.7000 S Third
24 0 3 female 8.0 3 1 21.0750 S Third
43 1 2 female 3.0 1 2 41.5792 C Second
58 1 2 female 5.0 1 2 27.7500 S Second
119 0 3 female 2.0 4 2 31.2750 S Third
who adult_male deck embark_town alive alone
10 child False G Southampton yes False
24 child False NaN Southampton no False
43 child False NaN Cherbourg yes False
58 child False NaN Southampton yes False
119 child False NaN Southampton no False
or연산자 |
를 사용하고 모든 필터링된 row에 대해서 age,sex,alone열만 선택적으로 인덱싱
mask3 = (titanic.age < 10) | (titanic.age >= 60)
df_under10_morethan60 = titanic.loc[mask3, ['age','sex','alone']]
print(df_under10_morethan60.head())
[Output]
age sex alone
7 2.0 male False
10 4.0 female False
16 2.0 male False
24 8.0 female False
33 66.0 male True
이 불린시리즈는 필터링의 기본이 된다. 어떤 다른 함수를 사용하더라도, 결국 그 함수의 반환값이 불린시리즈인 경우가 많기 때문이다.
isin()
함수 활용
sibsp열에 3또는 4또는 5의 값을 가지는 row만 필터링 하는 두가지 방법을 소개한다.
먼저 방금배운 불린시리즈를 활용한 경우이다.
import seaborn as sns
import pandas as pd
titanic = sns.load_dataset('titanic')
mask3 = titanic['sibsp'] == 3
mask4 = titanic['sibsp'] == 4
mask5= titanic['sibsp'] == 5
df_bln = titanic.loc[mask3 | mask4 | mask5, :]
print(df_bln.head())
[Output]
survived pclass sex age sibsp ... adult_male deck embark_town \
7 0 3 male 2.0 3 ... False NaN Southampton
16 0 3 male 2.0 4 ... False NaN Queenstown
24 0 3 female 8.0 3 ... False NaN Southampton
27 0 1 male 19.0 3 ... True C Southampton
50 0 3 male 7.0 4 ... False NaN Southampton
alive alone
7 no False
16 no False
24 no False
27 no False
50 no False
[5 rows x 15 columns]
이번에는 isin()
함수를 활용해보자.
이는 DataFrame의 열 객체.isin(추출 값의 리스트)
의 형태로 사용하며, 해당 시리즈의 개별원소들이 입력인자로 들어간 리스트의 원소들에 포함되어 있으면 True, 아니면 False를 반환해주는 함수이다.
isin_filter = titanic['sibsp'].isin([3,4,5])
df_isin = titanic[isin_filter]
print(df_isin.head())
[Output]
survived pclass sex age sibsp ... adult_male deck embark_town \
7 0 3 male 2.0 3 ... False NaN Southampton
16 0 3 male 2.0 4 ... False NaN Queenstown
24 0 3 female 8.0 3 ... False NaN Southampton
27 0 1 male 19.0 3 ... True C Southampton
50 0 3 male 7.0 4 ... False NaN Southampton
alive alone
7 no False
16 no False
24 no False
27 no False
50 no False
[5 rows x 15 columns]
간단하게 같은 결과를 얻어낼 수 있다.
Reference
도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.
댓글남기기