이번 포스팅에서는 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을 쓰면 손쉽게 해결이 가능합니다.
이번 포스팅은 여기서 마치겠습니다.
'개발 및 개발환경 > Python' 카테고리의 다른 글
[Python] List 내의 중복된 element 제거하기 (0) | 2022.09.21 |
---|---|
[Numpy] np.stack에 대한 이해 (0) | 2022.09.20 |
[Numpy] Matrix에 Vector를 Broadcasting하기 (0) | 2022.09.19 |