[Pandas] DataFrame 데이터 조회 (2) isin
지난번 loc
에 이어 같이 알면 좋은 isin
에 관하여 학습해보고자 한다.
isin
은 지난번 loc
에서처럼 SQL
의 WHERE
절과 유사하다.
메소드를 학습하기에 앞서 예제에서 사용할 데이터를 가져온다. 해당 데이터들은 KOSIS국가통계포털에서 찾을 수 있었던 2020년 6월 행정구역별 인구수이다.
1
2
3
4
5
6
7
8
| import pandas as pd
df = pd.read_excel('./행정구역인구수.xlsx', sheet_name='데이터변경', engine='openpyxl')
df.columns = ['region', 'tot_num', 'm_num', 'f_num']
df = df.set_index('region')
df[['tot_num', 'm_num', 'f_num']] = df[['tot_num', 'm_num', 'f_num']].astype('int64')
df.head()
|
| tot_num | m_num | f_num |
---|
region | | | |
---|
전국 | 51839408 | 25853937 | 25985471 |
---|
서울특별시 | 9720846 | 4732275 | 4988571 |
---|
종로구 | 150383 | 73288 | 77095 |
---|
중구 | 126092 | 61697 | 64395 |
---|
용산구 | 229431 | 110527 | 118904 |
---|
with List
isin
에 입력되는 값이 list
형태라면 list
에 들어있는 값이 데이터프레임에 들어있는지 체크한다.- 위의 데이터프레임에서 서울특별시의 총 인구수, 남성 인구수, 여성 인구수만 리스트형태로
isin
에 입력할 경우 데이터프레임에서 해당 value와 동일한 값을 가지는 값이 True
로 반환되는 것을 확인할 수 있다.
1
| df.isin([9720846, 4732275, 4988571]).head(5)
|
| tot_num | m_num | f_num |
---|
region | | | |
---|
전국 | False | False | False |
---|
서울특별시 | True | True | True |
---|
종로구 | False | False | False |
---|
중구 | False | False | False |
---|
용산구 | False | False | False |
---|
with Dict
isin
에 입력되는 값이 만약 {'column_name' : [value1, value2]}
인 dict
형태라면 dict
내부에 입력한 열만 부분적으로 해당 value들이 있나 없나 조회할 수 있다.- 쉽게확인하기 위해 region을 열로 전환시키고 region과 전국, 중구, 용산구를
dict
형식으로 isin
에 입력시키면 기존 region에서 전국, 중구, 용산구 값이 있던 자리만 True로 반환된 것을 확인할 수 있다.
1
2
| df = df.reset_index()
df.isin({'region' : ['전국', '중구', '용산구']}).head(5)
|
| region | tot_num | m_num | f_num |
---|
0 | True | False | False | False |
---|
1 | False | False | False | False |
---|
2 | False | False | False | False |
---|
3 | True | False | False | False |
---|
4 | True | False | False | False |
---|
응용
- 데이터프레임에서
True
& False
로 반환되는 것까지는 이해가 가지만, 이것을 어떻게 써먹을 수 있을까? 나같은 경우는 isin
을 SQL
의 WHERE
과 동일하게 사용한다(이게 당연한 것일 수도 있지만, 또 다른 사람들은 다르게 사용할 것이라 생각한다.). 만약 MySQL
이나 Oracle
에서 원하는 지역데이터만을 뽑아오고 싶을 때는 WHERE region IN('서울특별시', '용산구')
이런식으로 사용할 것이다. 이는 pandas
에서도 isin
을 통해 다음과 같이 사용할 수 있다.
1
| df[df['region'].isin(['서울특별시', '용산구'])]
|
| region | tot_num | m_num | f_num |
---|
1 | 서울특별시 | 9720846 | 4732275 | 4988571 |
---|
4 | 용산구 | 229431 | 110527 | 118904 |
---|
References