#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 есть хороший ответ на этот вопрос (получил мой голос). Подумайте о том, чтобы предоставить инициализированный фрейм данных в коде, подобном приведенному выше изображению. Цель-это то, что мы можем скопировать / изменить и опубликовать как проверенное решение.