Python: Errormessage: Ошибка значения: Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all()

#python-3.x #pandas #conditional-statements #isnull

#python-3.x #панды #условные утверждения #иснулл

Вопрос:

Я вызываю следующую функцию с параметрами. Параметр-это ключи для некоторых конкретных кадров данных, хранящиеся в словаре под названием: iNms

Моя функция в настоящее время выглядит следующим образом: функция

Но я получаю следующее сообщение об ошибке: fehler

Когда я печатаю левую сторону, я получаю «0», а с правой стороны я получаю «Ложь», я думаю, поэтому это не работает. Я уже пытаюсь преобразовать состояние правой стороны, но ошибка все еще есть.

У вас есть для меня какие-нибудь подсказки? Я совершенно новичок в python (1-2 недели), у меня есть только некоторые теоретические знания, поэтому я пытаюсь самостоятельно разобраться в своей проблеме, чтобы иметь опыт обучения.

Теперь с моим кодом и сообщением об ошибке в виде txt
С первой попытки я попробовал это:

 def check_missing_values(name):  if name in iNms:  if iNms[name].iloc[:,[0]].isnull().sum() == 0 and len(name)lt;8:  print('hurra')  with open('Log.txt','a') as w:  w.write('n{}tttKeine fehlenden PrimärschlüsseltOK'.format(name))  elif iNms[name].iloc[:,[0]].isnull().sum() == 0 and 18gt;=len(name)gt;=8:  print('hurra2')  with open('Log.txt','a') as w:  w.write('n{}ttKeine fehlenden PrimärschlüsseltOK'.format(name))   elif iNms[name].iloc[:,[0]].isnull().sum() != 0 and len(name)lt;8:  print('hurra3')  with open('Log.txt','a') as w:  w.write('n{}tttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   elif iNms[name].iloc[:,[0]].isnull().sum() !=0 and 18gt;=len(name)gt;=8:  print('hurra4')  with open('Log.txt','a') as w:  w.write('n{}ttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   else:  with open('Log.txt','a') as w:  if len(name)lt;17:  w.write('n{}ttnicht angeliefert'.format(name))  else:  w.write('n{}tnicht angeliefert'.format(name))     print('Left side:',iNms['transaction'].iloc[:,[2]].isnull().sum()) print('Left side:',type(iNms['transaction'].iloc[:,[2]].isnull().sum())) print('Right side:',len('transaction')lt;8) print('Right side:',type(len('transaction')lt;8))    

Моя вторая попытка

 def check_missing_values(name):  if name in iNms:  if (iNms[name].iloc[:,[0]].isnull().sum() == 0) amp; (len(name)lt;8):  print('hurra')  with open('Log.txt','a') as w:  w.write('n{}tttKeine fehlenden PrimärschlüsseltOK'.format(name))  elif (iNms[name].iloc[:,[0]].isnull().sum() == 0) amp; (18gt;=len(name)gt;=8):  print('hurra2')  with open('Log.txt','a') as w:  w.write('n{}ttKeine fehlenden PrimärschlüsseltOK'.format(name))   elif (iNms[name].iloc[:,[0]].isnull().sum() != 0) amp; (len(name)lt;8):  print('hurra3')  with open('Log.txt','a') as w:  w.write('n{}tttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   elif (iNms[name].iloc[:,[0]].isnull().sum() !=0) amp; (18gt;=len(name)gt;=8):  print('hurra4')  with open('Log.txt','a') as w:  w.write('n{}ttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   else:  with open('Log.txt','a') as w:  if len(name)lt;17:  w.write('n{}ttnicht angeliefert'.format(name))  else:  w.write('n{}tnicht angeliefert'.format(name))  print('Left side:',iNms['transaction'].iloc[:,[2]].isnull().sum()) print('Left side:',type(iNms['transaction'].iloc[:,[2]].isnull().sum())) print('Right side:',len('transaction')lt;8) print('Right side:',type(len('transaction')lt;8))  

Я получаю следующее сообщение об ошибке:

 Left side: transaction_ts 0 dtype: int64 Left side: lt;class 'pandas.core.series.Series'gt; Right side: False Right side: lt;class 'bool'gt; Traceback (most recent call last):  File "/home/tayfunuenver/Documents/Python/Parser_2.py", line 217, in lt;modulegt;  check_missing_values('customer')  File "/home/tayfunuenver/Documents/Python/Parser_2.py", line 174, in check_missing_values  if iNms[name].iloc[:,[0]].isnull().sum() == 0 and len(name)lt;8:  File "/home/tayfunuenver/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 1330, in __nonzero__  f"The truth value of a {type(self).__name__} is ambiguous. " ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().  

Комментарии:

1. Пожалуйста, вставьте свою функцию и полное сообщение об ошибке в виде текста. Вставка изображений затрудняет людям копирование-вставку и воспроизведение вашей проблемы.

2. Хорошо, вы правы. Я сделаю это, когда вернусь домой.

3. Теперь я обновил свой вопрос.

Ответ №1:

@Mortz Теперь я попробовал ваше решение. Первый вариант работает для меня, второй-нет, но я попробую еще раз, может быть, я допустил опечатку. Спасибо вам за вашу помощь.

Я нашел третье решение, которым хочу поделиться с этим сообществом. В то же время я немного сократил свой код. Теперь это выглядит так:

 def check_missing_values(name):    if name in iNms:  erstespalte_insight = iNms[name].iloc[:,[0]]  summiere_nullwerte = erstespalte_insight.isnull().sum().sum()  if summiere_nullwerte == 0 and len(name)lt;8:  print('hurra')  with open('Log.txt','a') as w:  w.write('n{}tttKeine fehlenden PrimärschlüsseltOK'.format(name))  elif summiere_nullwerte == 0 and 18gt;=len(name)gt;=8:  print('hurra2')  with open('Log.txt','a') as w:  w.write('n{}ttKeine fehlenden PrimärschlüsseltOK'.format(name))   elif summiere_nullwerte != 0 and len(name)lt;8:  print('hurra3')  with open('Log.txt','a') as w:  w.write('n{}tttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   elif summiere_nullwerte !=0 and 18gt;=len(name)gt;=8:  print('hurra4')  with open('Log.txt','a') as w:  w.write('n{}ttEinige oder mehrere Primärschlüssel fehlen. Nicht OK. Nacharbeiten!'.format(name))   else:  with open('Log.txt','a') as w:  if len(name)lt;17:  w.write('n{}ttnicht angeliefert'.format(name))  else:  w.write('n{}tnicht angeliefert'.format(name))   And the output on the terminal:    
 tayfunuenver@vmOperations1:~/Documents/Python$ /usr/bin/python3 /home/tayfunuenver/Documents/Python/Parser_2.py 1.Prüfung: ZIP-File erfüllt die Anforderungen des Datums: 2021-09-30 OK   hurra2 hurra hurra4 hurra  

Комментарии:

1. Отлично — если я правильно понял, вы сейчас «сворачиваете» значение Series в одно целое число, которое можно использовать с and

2. Да, это правильно.

Ответ №2:

Как указано в сообщении об ошибке, ваша ошибка находится в этой строке —

if iNms[name].iloc[:,[0]].isnull().sum() == 0 and len(name)lt;8:

Если вы посмотрите внимательно, вы используете и на двух отдельных типах объектов здесь —

iNms[name].iloc[:,[0]].isnull().sum() == 0 является первым объектом, и он возвращает a pd.Series , в то время как второй объект len(name) lt; 8 является логическим.

Итак, Питон и Панды услужливо говорят вам, что оценивают что-то вроде

pd.Series([True, True, False]) and True это двусмысленно.

Для вашего случая — есть несколько решений —

1

Либо используйте bool() из серии, так как ваша серия имеет только 1 значение —

(df.iloc[:, [0]].isnull().sum() == 0).bool() and (len(name) lt; 8)

2

Или воспользуйтесь amp; оператором —

(df.iloc[:, [0]].isnull().sum() == 0) amp; (len(name) lt; 8)

Комментарии:

1. Теперь я попробовал ваше решение. Первый вариант работает для меня, второй-нет, но я попробую еще раз, может быть, я допустил опечатку.

Ответ №3:

Ваша ошибка заключается в том, что для сравнения

 iNms[name].iloc[:,[0]].isnull().sum() == 0  

по-видимому, вы сравниваете ряд (возвращаемое значение sum() функции) с целым числом. Чтобы убедиться , что результат sum() всегда можно сравнить с целым 0 числом, вы можете написать

 int(iNms[name].iloc[:,[0]].isnull().sum()) == 0  

Комментарии:

1. Я тоже попробую это сделать. Спасибо вам за ваш ответ.