#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. Я тоже попробую это сделать. Спасибо вам за ваш ответ.