Значение истинности ряда неоднозначно. Используйте.empty, a.bool(), a.item(), a.any() или a.all() для этого оператора «==» Python Pandas

#python #pandas #if-statement #operator-keyword

Вопрос:

У меня есть такой сценарий

 if vms2['STATUS'] == 1:
    vms2['entry']=vms['STATUS'] vms2['status_after']
else :
    vms2['entry']=vms['STATUS'] vms2['status_before']
 

это показывает такую ошибку:

 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
 

Я новичок в Python, поэтому не могу понять источник ошибки. Пожалуйста, помогите.

ИЗМЕНИТЬ: образец фрейма данных:

Статус status_before статус_после
1 0.0 0.0
0 1.0 1.0
1 0.0 0.0
1 0.0 0.0

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

1. Пожалуйста, добавьте код для инициализации небольшого образца фрейма данных для этого вопроса. Мы должны быть в состоянии запустить код и получить вашу ошибку.

2. уже добавлено. Спасибо за исправление!

Ответ №1:

Для условной логики целого ряда или массива рассмотрите numpy.where и не if...else ожидайте скалярного сравнения. Помните, что программирование pandas/numpy заметно отличается от программирования на Python общего назначения.

Ниже используется функциональная форма арифметического оператора (т. е., Series.eq , Series.add ):

 vms2['entry'] = np.where(
    vms2['STATUS'].eq(1),
    vms2['STATUS'].add(vms2['status_after']),
    vms2['STATUS'].add(vms2['status_before'])
)
 

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

1. Спасибо! Когда я использую np.where, может ли он использоваться с 2-м уровнем np.where? это похоже на использование нескольких «ЕСЛИ».

2. Да, вы можете гнездиться numpy.where и при взаимоисключающих условиях, подумайте numpy.select . Многие панды StackOverflow задают вопросы по этому методу.

Ответ №2:

vms2['STATUS'] == 1 представляет собой ряд истинных/ложных значений.

 >>> vms2 = pd.DataFrame({"STATUS":[1,1,3,]})
>>> vms2["STATUS"] == 1
0     True
1     True
2    False
 

vms2['STATUS'] == 1 верно ли, если в столбце есть хотя бы один 1 ? Возможно, все ценности должны быть 1 такими ? Это зависит от требований этого фрагмента кода, это не то, о чем панды могут догадаться в целом. Вместо этого используйте один из методов, упомянутых в коде ошибки. Поскольку == возвращено a Series , вы можете поместить его в скобки для группировки, а затем связать метод в цепочку.

 >>> if (vms2["STATUS"] == 1).any():
...     print("foo")
... 
foo
 

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

1. То, что я хочу, — это в основном сравнить значения из нескольких столбцов для каждой строки. Я добавил образец фрейма данных в вопрос.

2. У @Parfait есть хороший ответ на этот вопрос (получил мой голос). Подумайте о том, чтобы предоставить инициализированный фрейм данных в коде, подобном приведенному выше изображению. Цель-это то, что мы можем скопировать / изменить и опубликовать как проверенное решение.