[Python]파이썬 데이터프레임(DataFrame) 문자열 포함 여부 확인시 발생하는 ValueError: Cannot mask with non-boolean array containing NA / NaN values 오류 처리하는 방법- str.contains()
엑셀파일(xlsx)을 읽어서 판다스(pandas) 데이터프레임(DataFrame) 타입으로 데이터를 읽어 들였다. 그리고 내가 찾고자하는 문자열을 포함하는 행을 찾기 위해 str.contains()메소드를 사용하였다. 이 함수를 사용하게되면 내가 찾는 문자열이 포함되어 있는 경우 True값을 반환하고, 그렇지 않은 경우에 False 값을 반환한다. 반환된 결과값은 pandas.Series 타입으로 반환된다. 그 코드는 아래와 같다.
import pandas
import xlrd
excel_dataFrame = pandas.read_excel("C:/python/1st_data.xlsx", engine="openpyxl")
tmp_df = excel_dataFrame["주소"].str.contains("서울")
print(tmp_df)
seoul_df = excel_dataFrame[tmp_df]
하지만 오류가 발생되었다. 오류 내용은 ValueError: Cannot mask with non-boolean array containing NA/ NAN values 이다.
Traceback (most recent call last):
File “C:pythonWorkspacemain.py”, line 14, in <module>
if excel_dataFrame[tmp_df] is not None:
File “C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagespandascoreframe.py”, line 2896, in __getitem__
if com.is_bool_indexer(key):
File “C:UsersilikeAppDataLocalProgramsPythonPython39libsite-packagespandascorecommon.py”, line 134, in is_bool_indexer
raise ValueError(na_msg)
ValueError: Cannot mask with non-boolean array containing NA / NaN values
오류가 발생한 위치로 찾아가보면 Frame.py파일이 열리게 되는데 boolean 타입의 데이터를 요구하고 있다. 결론은 엑셀에서 읽어들인 값중에 True 혹은 False로 리턴할 수 없는 데이터가 존재함을 의미한다. 만약 엑셀에 빈 로우가 포함되어있다면 가능성은 더욱 커진다.
오류해결을 위해서는 NA 또는 NaN값이 존재하는 경우에 대한 예외처리가 필요하다. 문자열을 찾을 때 칼럼에 NaN값이 존재하면 NaN값을 반환한다. 그렇기 때문에 오류가 발생하는 것이다. 이럴 경우를 대비하여 str.contains()함수의 인자값인 na변수를 사용하여 NaN을 만나게 되었을 경우에 대한 기본 값 설정이 필요하다.
NaN이 존재할 때 False로 치환하는 코드는 다음과 같다.
tmp_df = excel_dataFrame["주소"].str.contains("서울", na=False)
[연관글 더보기]
[Python] 파이썬 판다스(pandas)를 사용하여 엑셀(xlsx, csv)파일로 저장하는 방법 : numpy, openpyxl, to_excel(), to_csv()
[REFERENCE]