컴공생의 다이어리

[판다스, pandas] dataframe 특정 조건에 맞는 데이터 추출 본문

데이터 분석 & 머신러닝

[판다스, pandas] dataframe 특정 조건에 맞는 데이터 추출

컴공 K 2021. 10. 6. 00:01

pandas dataframe 특정 조건에 맞는 데이터 추출

pandas dataframe에서 특정 조건에 맞는 데이터를 추출하는 방법에 대해 정리하고자 한다.

 

데이터가 아래와 같이 있다고 가정한다.

import pandas as pd

df = pd.DataFrame([{"country":"한국","population":500},{"country":"미국","population":450},{"country":"싱가폴","population":705},
                   {"country":"호주","population":878},{"country":"베트남","population":660},{"country":"대만","population":808}])

 

여기서 만일 country가 한국일 때를 선택하고 싶다면 아래와 같이 코드를 작성하면 된다.

df[df['country'] == '한국']

 

또 country가 한국이거나 호주일때의 데이터를 추출하고 싶다면 아래와 같이 코드를 작성하면 된다.

df[(df['country']=='한국') | (df['country']=='호주')]

 

이번 코드는 country가 한국이 아닌 것 중 population이 800이상인 것을 추출하는 것이다.

df[(df['country']!='한국') & (df['population']>=800)]

 

한번 정리하고 가자면 추출하기 위한 조건이 2개 이상인 경우 각 조건을 괄호로 묶어주는 것이 안전하며 조건1과 조건2가 있을 때, 이 두 조건을 모두 만족하는 데이터를 추출하고 싶다면 &을 사용해주고 두 조건 중 하나라도 조건을 만족하는 데이터를 추출하고 싶다면 |를 사용해주면 된다.

# 조건을 둘다 만족해야 할때
df[(조건1) & (조건2)]

# 조건 중 하나라도 만족하면 될때
df[(조건1) | (조건2)]

 

그리고 만일 리스트 조건 안에 포함되는 데이터를 추출하고 싶다면 isin()함수를 사용해주면 된다. 만일, country가 [한국, 일본, 대만, 영국, 호주] 리스트에 포함되는 것을 추출하고 싶다면 기존에 조건을 여러개 열거했던 것처럼 사용하지 않고 아래 코드와 같은 형태를 사용함으로써 데이터를 추출할 수 있다.

country_list = ['한국', '일본', '대만', '영국', '호주']
df[df['country'].isin(country_list)]

 

반대로 country 열에 country_list에 포함되지 않는 데이터를 추출하고 싶다면 아래 코드 처럼 위의 코드에서 ~를 붙여 사용하면 된다.

country_list = ['한국', '일본', '대만', '영국', '호주']
df[~df['country'].isin(country_list)]

 

위처럼 리스트 조건에 포함되는 혹은 포함되지 않는 데이터를 추출할 때, in 혹은 not in 키워드를 사용해도 될 수 있겠다고 하지만, 불가능하다. 만일 in 키워드를 사용해 아래 코드와 같이 작성하면 아래 첨부한 사진 같은 오류가 발생할 것이다.

# 잘못된 방식
country_list = ['한국', '일본', '대만', '영국', '호주']
df[df['country'] in country_list]

 

 

 

 

https://rfriend.tistory.com/460

 

[Python pandas] DataFrame, Series에서 조건에 맞는 값이 들어있는 행 indexing 하기 : df.isin()

이번 포스팅에서는 Python pandas의 DataFrame, Series 에서 특정 칼럼 내에 특정 값을 가지고 있는 행 전체를 indexing 해오는 방법 2가지를 소개하겠습니다. (1) df.isin() 메소드를 이용한 DataFrame, Series..

rfriend.tistory.com

 

728x90
Comments