[파이썬 오류] ValueError : Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

2023. 4. 6. 23:44코딩/파이썬

다음과 같이 info가 비었는지 안 비었는지 확인하여 제대로 읽어왔는지 보려고 했는데, 시리즈의 Truth Value가 모호하다는 오류를 만났다. Truth Value 란 참거짓을 나타낼 수 있는 값으로, 파이썬에서는 TrueFalse를 뜻한다.

def get_info(old_code, new_code):
    tmp = obj.origin[obj.origin['코드(관리번호)'].str.contains(old_code, case=False, na=False)]
    cols = ['제조사', '반출(증)', '반환(증)', '현위치', '분류', '제조사', '모델명', '시리얼넘버', '자산관리번호']
    info = tmp[cols]
    if info : <----- 발생 위치                                                     
        print("[*] 정보 가져오기 성공 ...\n")
        print(tabulate(info, headers=cols, tablefmt='fancy_outline'))

위 코드를 보면 if 문은 True 아니면 False 를 요구하는데, 리스트나 딕셔너리는 저렇게 표현해도 아무 문제가 없다.

리스트나 딕셔너리에는 오류가 발생하지 않는 것에 반해 데이터프레임의 경우, ambiguous 에러가 발생함

하지만 시리즈는 '시리즈 자체'에 어떤 값이 있을 때 True를 리턴하는 것이 아니라, 시리즈에 들어있는 각 값에 TrueFalse가 리턴된다. 말로 하니 어려운데, 그림으로 표현하면 다음과 같다.


(사실 데이터프레임에 NaN값이 있으면 ambiguous 어쩌구 하는 다른 오류가 발생하지만, 이를 처리해줬다고 가정하고 NaN은 False로 친다.)
이렇게 여러 개의 Truth Value가 리턴되다 보니 if문 입장에서는 어떤 값을 사용해야 하는 것인지 모르기 때문에 'ambiguous', 모호하다는 에러가 발생하는 것이다.
이 에러는 데이터프레임에서 조건식을 적용하여 데이터프레임의 복사본을 만들 때 자주 발생한다고 한다.

애시당초 나는 그냥 값이 있는지 없는지만 확인하면 됐으므로, info의 길이를 체크하는 것으로 코드를 수정하여 오류를 해결했다.

if len(info) > 0 :
    ...이하 생략 ...

Reference

https://www.learndatasci.com/solutions/python-valueerror-truth-value-series-ambiguous-use-empty-bool-item-any-or-all/

 

ValueError: The truth value of a series is ambiguous. use a.empty, a.bool(), a.item(), a.any() or a.all() – LearnDataSci

Cookie Policy We use cookies to operate this website, improve usability, personalize your experience, and improve our marketing. Privacy Policy. By clicking "Accept" or further use of this website, you agree to allow cookies. Accept You are reading solutio

www.learndatasci.com