Python

[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()

 

[Python] 파이썬 판다스(pandas)를 사용하여 엑셀(xlsx, csv)파일로 저장하는 방법 : numpy, openpyxl, to_excel(

판다스(pandas)는 데이터 분석을 위해 많이 사용되는 모듈입니다. xlsx, csv파일을 읽어와서 DataFrame으로 가져올 수 있습니다. 또다른 방법은 웹 크롤링을 하여 가져올 수 있습니다. 판다스(pandas)를

playground.naragara.com

[REFERENCE]

 

Ignoring NaNs with str.contains

REFERENCE

I want to find rows that contain a string, like so: DF[DF.col.str.contains(“foo”)] However, this fails because some elements are NaN: ValueError: cannot index with vector containing NA / NaN v…

stackoverflow.com

 

Leave a Reply

error: Content is protected !!