用熊猫的if语句抛出“ ValueError:系列的真值不明确”

时间:2019-01-12 21:04:04

标签: python python-3.x string pandas

我想查看我的数据框中是否有针对某一列的特定字符串,如果有,请启动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 :(得分:2)

此错误的原因是因为python中的if-else表达式用于比较标量布尔值。您通过了系列赛。

Pandas Gotchas的“文档”部分中查看更多内容。

  

pandas遵循NumPy约定,在尝试时会引发错误   将某物转换为bool。这会在if陈述中或   使用布尔操作:andornot时。


在此示例中,您可以将它们组合成单个正则表达式模式'string2?',该模式表示'2'是可选的。

def make_request():
    ...

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

如果您的make_request函数返回了某些内容,则可以在列表组合中调用它并分配回去:

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

另一个选择是使用正则表达式或管道将字符串连接到列表中。

import re

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