[Pandas 기초] 데이터프레임의 필터링(filtering)

업데이트:

개요

jpg

파이썬의 내장함수인 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

도서 [파이썬 머신러닝 판다스 데이터 분석]을 공부하며 작성하였습니다.

댓글남기기