错误:系列的真值不明确 - Python pandas

Posted

技术标签:

【中文标题】错误:系列的真值不明确 - Python pandas【英文标题】:Error: The truth value of a Series is ambiguous - Python pandas 【发布时间】:2018-01-11 15:12:23 【问题描述】:

我知道以前有人问过这个问题,但是,当我尝试执行 if 语句时,我遇到了错误。我看了这个 link ,但对我的情况没有多大帮助。我的dfs 是一个数据框列表。

我正在尝试以下方法,

for i in dfs:
    if (i['var1'] < 3.000):
       print(i)

给出以下错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

并且我尝试了以下操作并得到了同样的错误。

for i,j in enumerate(dfs):
    if (j['var1'] < 3.000):
       print(i)

我的var1 数据类型是float32。我没有使用任何其他logical 运算符和&amp;|。在上面的链接中,这似乎是因为使用了逻辑运算符。为什么我会收到ValueError

【问题讨论】:

if 什么时候应该是真的?从那一刻起,至少有一个这样的行?还是从那一刻起所有值都小于 3? @i.n.n.m,您是否意识到您的比较与[1,2,3,4,5] &gt; 2 非常相似?你期待什么结果? @i.n.n.m i 是一个数据框,所以 i['var1'] 是一个系列。正如@MaxU 所说,这相当于将系列中的每个元素与您的值进行比较,例如[1 &lt; 3, 2 &lt; 3, 3 &lt; 3, 4 &lt; 3, 5 &lt; 3]。结果是一个形状相同的系列,每次比较的结果,[True, True, False, False, False] @i.n.n.m 与您使用的条款和我们看到的结果脱节。除非您通过向我们展示数据、您的代码以及您想要获得的内容来帮助我们,否则我们无法调和这些差异。这是提供最小、完整和可验证示例的精神或MCVE @i.n.n.m,我很确定您在尝试显示所需的数据集时会自己发现它;-) 请听 piRSquared - 这将节省您和我们的时间。请阅读how to make good reproducible pandas examples 【参考方案1】:

这是一个小演示,说明了为什么会发生这种情况:

In [131]: df = pd.DataFrame(np.random.randint(0,20,(5,2)), columns=list('AB'))

In [132]: df
Out[132]:
    A   B
0   3  11
1   0  16
2  16   1
3   2  11
4  18  15

In [133]: res = df['A'] > 10

In [134]: res
Out[134]:
0    False
1    False
2     True
3    False
4     True
Name: A, dtype: bool

当我们尝试检查此类 Series 是否为 True - Pandas 不知道该怎么做:

In [135]: if res:
     ...:     print(df)
     ...:
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
...
skipped
...
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

解决方法:

我们可以决定如何处理一系列布尔值 - 例如,如果 所有 值都是 Trueif 应该返回 True

In [136]: res.all()
Out[136]: False

或者当至少一个值为真时:

In [137]: res.any()
Out[137]: True

In [138]: if res.any():
     ...:     print(df)
     ...:
    A   B
0   3  11
1   0  16
2  16   1
3   2  11
4  18  15

【讨论】:

【参考方案2】:

目前,您正在选择整个系列进行比较。要从系列中获取单个值,您需要使用以下内容:

for i in dfs:
if (i['var1'].iloc[0] < 3.000):
   print(i)

要比较每个单独的元素,您可以使用series.iteritems(关于这个的文档很少),如下所示:

for i in dfs:
    for _, v in i['var1'].iteritems():
        if v < 3.000:
            print(v)

对于大多数情况,这里更​​好的解决方案是选择数据框的一个子集以用于您需要的任何内容,如下所示:

for i in dfs:
    subset = i[i['var1'] < 3.000]
    # do something with the subset

当使用系列运算而不是迭代单个值时,pandas 在大型数据帧上的性能要快得多。更多详情可以查看pandasdocumentation on selection.

【讨论】:

【参考方案3】:

比较返回一个范围的值,你需要通过any()或all()来限制它,例如,

     if((df[col] == ' this is any string or list').any()):
       return(df.loc[df[col] == temp].index.values.astype(int)[0])

【讨论】:

这是一个被低估的答案,就像一个魅力!谢谢。

以上是关于错误:系列的真值不明确 - Python pandas的主要内容,如果未能解决你的问题,请参考以下文章

无法删除数据框 python 3 中的行。值错误:真值不明确

如何解决 Python Pandas 中的“系列的真值不明确。使用 an.empty、a.bool()、a.item()、a.any() 或 a.all()”? [复制]

如果导致系列的真值不明确的条件。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() [重复]

GridSearchCV - 错误:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

序列的真值不明确的循环返回错误

基于if语句的for循环,错误消息= Series的真值不明确[重复]