错误:系列的真值不明确 - 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
运算符和&
或|
。在上面的链接中,这似乎是因为使用了逻辑运算符。为什么我会收到ValueError
?
【问题讨论】:
if
什么时候应该是真的?从那一刻起,至少有一个这样的行?还是从那一刻起所有值都小于 3?
@i.n.n.m,您是否意识到您的比较与[1,2,3,4,5] > 2
非常相似?你期待什么结果?
@i.n.n.m i
是一个数据框,所以 i['var1']
是一个系列。正如@MaxU 所说,这相当于将系列中的每个元素与您的值进行比较,例如[1 < 3, 2 < 3, 3 < 3, 4 < 3, 5 < 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().
解决方法:
我们可以决定如何处理一系列布尔值 - 例如,如果 所有 值都是 True
,if
应该返回 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() [重复]