-
[pandas] ==와 is는 같지 않으니 주의하자개발 끄적 2022. 4. 12. 00:44

데이터를 다루는 사람이라면 Jupyter Notebook에서 실험을 많이 한다.
그리고 제대로 돌리기 위해서 python 코드로 옮기는 작업을 하곤 한다.
ipynb는 스크립트니 그대로 옮기진 않게 되는데 이런 과정에서 많은 에러를 유발하곤 한다.
notebook과는 다르게 데이터 프레임이 넘어가는게 중간중간 보이지 않다보니 디버깅이 쉽진 않다.
문제 상황
분명 똑같이 옮겼다고 생각했는데 에러가 발생했다.
에러가 발생한 구문은 아래와 같다.
df = df[df['age'].isna() is False]내가 가진 데이터에서 age가 null이 아닌 row만 남기고 싶었다.
나이스하진 않은 방식같긴 하다만 일단 그건 논외고..
에러는 KeyError이였다. (raise KeyError(key) from err)
삽질
조건절에서 접근하려는 index가 아마 df에 없기때문일텐데 그럴리가 없어서 한참을 봤다.
저 구문 앞쪽에서 뭔가 망가뜨렸다 airflow에서 열심히 logging을 한땀 한땀 찍어봤다.
데이터 프레임이 다소 크다보니 오래 걸리기도 하고 Jupyter에서는 잘 돌던 코드라서 의아했다.
pep 8이 잘못했네
원인은 어이없게도 pandas 한정으로 is와 ==는 다르다는 것이었다.
뭐가 다른지는 아래에서 살펴보고,
ipynb -> python으로 옮기다보니 후자는 pycharm에서 작성을 했는데
pep8이 저 부분에서 ==를 쓰지말고 is를 쓰라고 하길래 생각없이 is로 바꿨었다.
이게 문제였던 것이다.
is와 ==는 다르다
python은 함수뿐만 아니라 연산자도 overload를 지원한다.
일반적으로 python에서 ==는 True/False를 반환한다.
하지만 pandas에서는 ==를 overload했는데 True/False대신 Series를 반환한다.
is는 overload된게 아니니 True/False를 반환한다.
그러니 아래에서는 age가 null이 아닌 row의 index를 Series로 넘겨서,
그에 해당하는 row로만 dataframe를 구성시켜준다.
df = df[df['age'].isna() == False]반면 아래에서는 False인지 아닌지 True/False로 반환해 줄 것이므로
df에서는 boolean을 key로 받아서 찾을 수 있는게 없으므로 에러가 발생한다.
df = df[df['age'].isna() is False]어휴 이걸로 얼마나 시간을 버렸는지..
'개발 끄적' 카테고리의 다른 글
[GCP] Cloud NAT (0) 2022.08.22 [Airflow] Composer에서 worker 숫자가 늘지 않았던 일 (0) 2022.04.12 [BigQuery] EXECUTE IMMEDIATE가 이상해요 (0) 2022.04.06 [BigQuery] Backtick 사용에 대한 고찰 (0) 2022.04.05 GCP에 Jupyter Notebook 셋팅 (0) 2021.04.19