본문 바로가기

카테고리 없음

[파이썬] Pandas 특정 조건을 만족하는 데이터 필터링하기

이번에는 판다스를 이용해서 내가 원하는 조건으로 데이터를 필터링하는 방법을 알아보겠습니다. 

 

샘플 데이터 불러오기

In [1]:
# 판다스 라이브러리 임포트
import pandas as pd
# plotly express에 내장되어있는 gapminder 데이터프레임을 사용하겠습니다.
import plotly.express as px
# plotly가 설치되어있지 않다면 아래 명령으로 설치할 수 있습니다.
# !pip install plotly
 
In [2]:
df = px.data.gapminder()
 

 

데이터 살펴보기

In [3]:
df.head()
 
Out[3]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
 

 

특정 조건을 만족하는 데이터 필터링하기

데이터 분석을 하다보면 특정한 조건을 만족하는 행을 필터링해야하는 경우가 많이 있습니다. 예를 들어 특정 값을 초과하는 모든 행을 선택해서 새로운 데이터셋으로 만들고 싶을 수 있습니다. 또는 특정 단어나 숫자가 포함되어 있는 행만 필요할 수도 있습니다. 그러므로 이번에는 판다스를 사용해서 특정 조건을 만족하는 행을 필터링하는 방법을 알아보겠습니다.

 

특정 조건을 만족하는 행을 필터링하는 방법은 크게 세 가지 단계를 거칩니다.

 

  1. 컬럼을 선택합니다.

  2. 컬럼의 데이터와 특정 조건을 비교합니다. 조건을 만족하는 경우에는 True, 아닌 경우에는 False 반환합니다.

  3. 비교 결과를 이용해서 데이터프레임에서 일부 데이터를 추출합니다.

 

자세한 내용은 아래 예제를 보면서 알아보겠습니다.

 

 

특정 값과 일치하는 데이터 필터링하기

country 컬럼의 값이 Venezuela인 데이터를 필터링하겠습니다. 그 결과를 새로운 변수에 할당한 뒤 데이터를 출력하겠습니다.

 

In [4]:
# country 컬럼을 선택합니다.
# 컬럼의 값과 조건을 비교합니다.
# 그 결과를 새로운 변수에 할당합니다.
is_venezuela = df['country'] == 'Venezuela'

# 조건를 충족하는 데이터를 필터링하여 새로운 변수에 저장합니다.
venezuela = df[is_venezuela]

# 결과를 출력합니다.
venezuela
 
Out[4]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
1632 Venezuela Americas 1952 55.088 5439568 7689.799761 VEN 862
1633 Venezuela Americas 1957 57.907 6702668 9802.466526 VEN 862
1634 Venezuela Americas 1962 60.770 8143375 8422.974165 VEN 862
1635 Venezuela Americas 1967 63.479 9709552 9541.474188 VEN 862
1636 Venezuela Americas 1972 65.712 11515649 10505.259660 VEN 862
1637 Venezuela Americas 1977 67.456 13503563 13143.950950 VEN 862
1638 Venezuela Americas 1982 68.557 15620766 11152.410110 VEN 862
1639 Venezuela Americas 1987 70.190 17910182 9883.584648 VEN 862
1640 Venezuela Americas 1992 71.150 20265563 10733.926310 VEN 862
1641 Venezuela Americas 1997 72.146 22374398 10165.495180 VEN 862
1642 Venezuela Americas 2002 72.766 24287670 8605.047831 VEN 862
1643 Venezuela Americas 2007 73.747 26084662 11415.805690 VEN 862
 
 

두가지 조건을 만족하는 데이터 필터링하기

1) continent 컬럼의 값이 Asia이면서 2) lifeExp 컬럼의 값이 80 이상인 데이터를 필터링하겠습니다. 그 결과를 새로운 변수에 할당한 뒤 데이터를 출력하겠습니다.

 
In [5]:
# continent 컬럼을 선택합니다.
# 컬럼의 값과 조건을 비교합니다.
# 그 결과를 새로운 변수에 할당합니다.
is_asia = df['continent'] == 'Asia'

# lifeExp 컬럼을 선택합니다.
# 컬럼의 값과 조건을 비교합니다.
# 그 결과를 새로운 변수에 할당합니다.
lifeExp_greather_80 = df['lifeExp'] >= 80

# 두가지 조건를 동시에 충족하는 데이터를 필터링하여 새로운 변수에 저장합니다. (AND)
subset_df = df[is_asia & lifeExp_greather_80]

# 결과를 출력합니다.
subset_df
 
Out[5]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
669 Hong Kong, China Asia 1997 80.000 6495918 28377.63219 HKG 344
670 Hong Kong, China Asia 2002 81.495 6762476 30209.01516 HKG 344
671 Hong Kong, China Asia 2007 82.208 6980412 39724.97867 HKG 344
767 Israel Asia 2007 80.745 6426679 25523.27710 ISR 376
801 Japan Asia 1997 80.690 125956499 28816.58499 JPN 392
802 Japan Asia 2002 82.000 127065841 28604.59190 JPN 392
803 Japan Asia 2007 82.603 127467972 31656.06806 JPN 392
 

 

제외 조건을 만족하는 데이터 필터링하기

country 컬럼의 값이 Japan이 아닌 데이터를 필터링하겠습니다. 그 결과를 새로운 변수에 할당한 뒤 상위 5개의 행을 출력하겠습니다.

 

In [6]:
# continent 컬럼을 선택합니다.
# 컬럼의 값과 조건을 비교합니다.
# 그 결과를 새로운 변수에 할당합니다.
not_japan = df['country'] != 'Japan'

# 조건를 충족하는 데이터를 필터링하여 새로운 변수에 저장합니다.
subset_df = df[not_japan]

# 결과를 출력합니다.
print(subset_df.shape)
print()

subset_df.head()
 
(1692, 8)

 
Out[6]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
 
 

위의 코드를 ~를 사용해서 다시 실행시켜 보겠습니다. ~는 True를 False로, False를 True로 뒤집어주는 역할을 합니다.

 

In [7]:
# continent 컬럼을 선택합니다.
# 컬럼의 값과 조건을 비교합니다.
# 그 결과를 새로운 변수에 할당합니다.
is_japan = df['country'] == 'Japan'

# 조건를 충족하지 않는 데이터를 필터링하여 새로운 변수에 저장합니다.
subset_df = df[~is_japan]

# 결과를 출력합니다.
print(subset_df.shape)
print()

subset_df.head()
 
(1692, 8)

 
Out[7]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
 
 

동일한 결과가 나온 것을 알 수 있습니다. 그러므로 1) != 쓰는 코드와 2) ~를 사용하는 코드 둘중 무엇을 써도 무방합니다.

 

특정 문자열을 포함하는 데이터 필터링하기

이번에는 판다스의 함수를 이용하여 데이터를 필터링 해보겠습니다. 특정 단어가 포함된 데이터를 필터링하기 위해서는 .str.contains()라는 함수를 사용해야합니다. 이 함수는 해당 컬럼의 값에 특정 문자열이 포함(contains)되어 있을 경우에는 True, 아닌 경우에는 False를 반환합니다.

 

예를 들어 country 컬럼의 값에 Korea 또는(|) Japan이라는 문자열이 포함된 데이터를 추출하고 싶다면 아래와 같이 할 수 있습니다.

 

In [8]:
# country 컬럼을 선택합니다.
# 컬럼의 값에 Korea 또는(|) Japan이라는 문자열이 포함되어있는지 판단합니다.
# 그 결과를 새로운 변수에 할당합니다.
contains_korea_or_japan = df['country'].str.contains("Japan|Korea")

# 조건를 충족하는 데이터를 필터링하여 새로운 변수에 저장합니다.
subset_df = df[contains_korea_or_japan]

# 결과를 출력합니다.
print(subset_df.shape)
print()

subset_df
 
(36, 8)

 
Out[8]:
 
  country continent year lifeExp pop gdpPercap iso_alpha iso_num
792 Japan Asia 1952 63.030 86459025 3216.956347 JPN 392
793 Japan Asia 1957 65.500 91563009 4317.694365 JPN 392
794 Japan Asia 1962 68.730 95831757 6576.649461 JPN 392
795 Japan Asia 1967 71.430 100825279 9847.788607 JPN 392
796 Japan Asia 1972 73.420 107188273 14778.786360 JPN 392
797 Japan Asia 1977 75.380 113872473 16610.377010 JPN 392
798 Japan Asia 1982 77.110 118454974 19384.105710 JPN 392
799 Japan Asia 1987 78.670 122091325 22375.941890 JPN 392
800 Japan Asia 1992 79.360 124329269 26824.895110 JPN 392
801 Japan Asia 1997 80.690 125956499 28816.584990 JPN 392
802 Japan Asia 2002 82.000 127065841 28604.591900 JPN 392
803 Japan Asia 2007 82.603 127467972 31656.068060 JPN 392
828 Korea, Dem. Rep. Asia 1952 50.056 8865488 1088.277758 KOR 410
829 Korea, Dem. Rep. Asia 1957 54.081 9411381 1571.134655 KOR 410
830 Korea, Dem. Rep. Asia 1962 56.656 10917494 1621.693598 KOR 410
831 Korea, Dem. Rep. Asia 1967 59.942 12617009 2143.540609 KOR 410
832 Korea, Dem. Rep. Asia 1972 63.983 14781241 3701.621503 KOR 410
833 Korea, Dem. Rep. Asia 1977 67.159 16325320 4106.301249 KOR 410
834 Korea, Dem. Rep. Asia 1982 69.100 17647518 4106.525293 KOR 410
835 Korea, Dem. Rep. Asia 1987 70.647 19067554 4106.492315 KOR 410
836 Korea, Dem. Rep. Asia 1992 69.978 20711375 3726.063507 KOR 410
837 Korea, Dem. Rep. Asia 1997 67.727 21585105 1690.756814 KOR 410
838 Korea, Dem. Rep. Asia 2002 66.662 22215365 1646.758151 KOR 410
839 Korea, Dem. Rep. Asia 2007 67.297 23301725 1593.065480 KOR 410
840 Korea, Rep. Asia 1952 47.453 20947571 1030.592226 KOR 410
841 Korea, Rep. Asia 1957 52.681 22611552 1487.593537 KOR 410
842 Korea, Rep. Asia 1962 55.292 26420307 1536.344387 KOR 410
843 Korea, Rep. Asia 1967 57.716 30131000 2029.228142 KOR 410
844 Korea, Rep. Asia 1972 62.612 33505000 3030.876650 KOR 410
845 Korea, Rep. Asia 1977 64.766 36436000 4657.221020 KOR 410
846 Korea, Rep. Asia 1982 67.123 39326000 5622.942464 KOR 410
847 Korea, Rep. Asia 1987 69.810 41622000 8533.088805 KOR 410
848 Korea, Rep. Asia 1992 72.244 43805450 12104.278720 KOR 410
849 Korea, Rep. Asia 1997 74.647 46173816 15993.527960 KOR 410
850 Korea, Rep. Asia 2002 77.045 47969150 19233.988180 KOR 410
851 Korea, Rep. Asia 2007 78.623 49044790 23348.139730 KOR 410
 

이외에도 특정 문자열과 동일한 데이터를 필터링하는 .isin() 함수, 결측값(Nan)를 필터링하는 .isnull() 함수 등 여러 유용한 함수가 있습니다.

 

 

-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.