If-оператор с пандами выдает «ValueError: Истинное значение Серии неоднозначно» - PullRequest
0 голосов
/ 13 января 2019

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

if new_df.col1.str.contains('string') == True:
    POST REQUEST
elif new_df.col2.str.contains('string2') == True:
    POST REQUEST

else:
  print('not good')

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

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

1 Ответ

0 голосов
/ 13 января 2019

Причина этой ошибки в том, что выражения if-else в python предназначены для сравнения скалярных логических значений. Вы прошли серию.

См. Больше в разделе документов на Pandas Gotchas .

pandas следует соглашению NumPy о возникновении ошибки при попытке преобразовать что-то в bool. Это происходит в операторе if или при использовании логических операций: and, or и not.


В этом примере вы можете объединить их в один шаблон регулярных выражений 'string2?', который указывает, что '2' является необязательным.

def make_request():
    ...

for mask in new_df.col1.str.contains(r'string2?'):
    if mask:
        make_request()

Если ваша функция make_request что-то возвращает, вы можете вызвать ее в списке comp и присвоить обратно:

df['response'] = [
    make_request() if m else np.nan for m in new_df.col1.str.contains(r'string2?')]

Другой вариант - использовать регулярное выражение ИЛИ pipe для объединения строк в списке.

import re

words = ['string', 'string2']
for mask in new_df.col1.str.contains('|'.join(map(re.escape, words))):
    ...
...