개요
Pandas로 데이터프레임을 처리하다 보면 아래와 같이 None과 NaN이 혼재되어 있는 경우가 있을 수 있다.
이때 결측치를 None으로 치환하는 방식으로 처리하려고 한다. 내용을 적어둔다.
NaN과 None의 차이
먼저 결측치와 None은 다르다는 점을 이해해야 한다.
NaN은 float 객체로 벡터화 연산을 허용하는 반면, None은 Python의 NoneType 객체로 벡터화 연산을 허용하지 않는다.
print(f'type(None): {type(None)}')
print(f'type(np.NaN): {type(np.NaN)}')
또한 NaN은 어떤 값과 비교해도 같지 않다고 판단하기 때문에 두 값을 비교 연산자로 확인해 보면 서로 같지 않다.
print(np.NaN == None) # False
print(np.NaN is None) # False
print(None == None) # True
print(None is None) # True
print(np.NaN == np.NaN) # False
다만 isnull 등의 함수로 확인해보면 NaN과 None 모두 결측치로 판단한다.
print(df.loc[0])
print(df.loc[0].isnull())
NaN을 None으로 치환
DataFrame에서 NaN을 None으로 치환한다. 참고로 fillna(None)을 시도하면 아래와 같은 에러가 발생한다.
ValueError: Must specify a fill 'value' or 'method'.
DataFrame.replace 함수는 지정된 값을 다른 값으로 바꾸는 함수인데, 문자열, 숫자, 정규식, 딕셔너리 등등으로 바꿀 값을 전달할 수 있다. 아래와 같이 바꿀 값을 전달하면
display(df.replace({np.nan: None}))
NaN을 None으로 변경된 모습을 확인할 수 있다.
참고 문서
https://stackoverflow.com/questions/46283312/how-to-proceed-with-none-value-in-pandas-fillna
[Python] numpy NaN을 None으로 변환하기
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.replace.html