【问题标题】:Error: Truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()错误:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()
【发布时间】:2021-07-02 15:17:45
【问题描述】:

我想创建如下条件来评估 HUB 状态 ...

  1. CUR_RULE=DEFAULT 和 PREV_RULE=DEFAULT,然后ok
  2. CUR_RULE=DEFAULT 和 PREV_RULE!=DEFAULT,然后不行
  3. CUR_RULE!=DEFAULT 和 PREV_RULE=DEFAULT,然后ok
  4. CUR_RULE!=DEFAULT 和 PREV_RULE!=DEFAULT,然后ok

我正在尝试运行以下代码:

df3=df1[df1['STATUS']=='CHANGED']
df3.insert(7, 'HUB STATUS','')
df3.insert(8, 'COMMENT','')
if df3[df3['CUR_RULE']=='DEFAULT'] and df3[df3['PREV_RULE']=='DEFAULT']:
    df3['HUB STATUS']='OK'
elif df3[df3['CUR_RULE']=='DEFAULT'] and df3[df3['PREV_RULE']!='DEFAULT']:
    df3['HUB STATUS']='NOT OK'
elif df3[df3['CUR_RULE']!='DEFAULT'] and df3[df3['PREV_RULE']=='DEFAULT']:
    df3['HUB STATUS']='OK'
else:
    df3['HUB STATUS']='NOT OK'

我收到此错误:

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

【问题讨论】:

  • 添加pandas标签,如果你真的在使用pandas模块
  • 为了正确响应您的请求,请提供您的输入数据框示例。您的错误的直接原因似乎在以下代码行和您使用类似结构的其他地方:df3[df3['CUR_RULE']=='DEFAULT'] 问题是 == 左侧的因素是熊猫系列,而不是单个值,但您正在尝试与单个值进行比较。
  • 这能回答你的问题吗? Logical operators for boolean indexing in Pandas

标签: python-3.x dataframe


【解决方案1】:

问题:索引内没有真值

在普通 Python 中,逻辑布尔表达式可以使用 orand,它们要求每一边都有真值。除了==!= 之类的比较之外,这些形式的有效表达式可在 if 语句中使用。

但是当在 panda 的数据框索引(方括号选择一列)中使用时,它们是无效的。像索引尝试 df3[df3['CUR_RULE']=='DEFAULT'] 在方括号 df3['CUR_RULE']=='DEFAULT' 内包含一个布尔条件。

对于 pandas,这些 index 表达式的计算结果是一个被认为 不明确 的真值。

过滤器:在条件中使用位运算符

您可以改为使用位运算

  • |(或)
  • &(和)

Difference between 'and' and '&' in Python

例如,当 filters 与 panda 的 where 一起应用时,例如:

# filtering data
df3.where(df3['CUR_RULE'] == 'DEFAULT' & df3['PREV_RULE'] == 'DEFAULT', inplace=True)
print(df3) # show series filtered for df3['HUB STATUS']='OK'

Pandas where: How to Use Pandas DataFrame where()

Map:使用三元(类似于 if-else)

或更好地使用map 函数,就像这里使用 lambda:

# mapping data using a function, dict, or lambda
map_hub = lambda x: 'NOT OK' if x['CUR_RULE'] == 'DEFAULT' and x['PREV_RULE'] != 'DEFAULT' else 'OK' 

df3['HUB STATUS'] = df3.map(map_hub)

Adding a new pandas column with mapped value from a dictionary

另见

【讨论】:

    猜你喜欢
    • 2021-06-02
    • 1970-01-01
    • 2021-08-31
    • 2016-12-01
    • 1970-01-01
    • 2021-09-15
    • 2020-10-15
    • 2021-08-14
    • 2019-01-24
    相关资源
    最近更新 更多