배워서 남 주자

개발 및 개발환경/Python

[Pandas] 특정 list내에 있는 것들로만 추출하려면? isin!

신라면순한맛 2022. 10. 14. 21:36

이번 포스팅에서는 pandas dataframe 내부 method인 isin을 알아보도록 하겠습니다.

 


 

다음과 같은 dataframe이 있다고 해보겠습니다.

df = pd.DataFrame(np.arange(10, 30).reshape(10, 2), columns=['a', 'b'])
print(df)

 

이 dataframe의 a열에서 [20, 22, 24]를 포함하는 행만 추출하고 싶다면 어떻게 해야할까요?

처음에는 아래와 같이 나이브하게 접근했더니 다음과 같은 에러가 떴습니다.

target_list = [20, 22, 24]
print(df[df['a'] in target_list])
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

 

그래서 이를 해결하기 위해 시도했던 방법 중 하나가 바로 apply였습니다.

target_list = [20, 22, 24]
print(df[df['a'].apply(lambda x: x in target_list)])

 

하지만 이는 dataframe이 어마어마하게 크다면 거의 멈추다시피 하며 작동하지 않습니다. 3천만줄, 4천만줄이나 가지고 있는 dataframe에서하는 하세월이죠. 이 상황에서 해결하는 방법 중 하나로 pandas를 parallel하게 processing해주는 dask, vaex, modin 등이 있으나 저는 왜인지 작동을 하지 않아서 쓰지 못했습니다. 그러던 도중 현재 task에 맞는 pandas 내부 library가 있었으니! 그것이 바로 isin입니다.

target_list = [20, 22, 24]
print(df[df['a'].isin(target_list)])

 

이렇게 하니 apply를 쓰던 것보다 월등히 빨라지는 것을 확인하였습니다. 시간비교는 할 수 없었던 것이, apply를 적용한 것은 거의 멈추다시피 했기에 중간에 끊었기 때문입니다... ㅎㅎ

 

apply는 각 row마다 특정 함수를 적용시키는건데, 이걸 한줄한줄 적용하다보니 당연히 오래 걸릴 수 밖에 없었습니다. 지금과 같이 특정 list에 있는 row만 추출하고 싶은 상황이라면, 굳이 apply를 쓸 것이 아니라 isin을 쓰면 손쉽게 해결이 가능합니다.

 


 

이번 포스팅은 여기서 마치겠습니다.