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

Posted

技术标签:

【中文标题】pandas 错误:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()【英文标题】:pandas error: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all() 【发布时间】:2020-10-15 20:01:18 【问题描述】:

我有一个数据框。

distdf=pd.DataFrame(dist)
for i in range(len(distdf)):
    if distdf.loc[i]==distdf.loc[i+1]:
        print("true")
    else:
        print('no')

但我有一个错误。

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

我该如何解决?

【问题讨论】:

【参考方案1】:

您的代码失败,因为 distdf.loc[i] == distdf.loc[i+1] 尝试 比较整行,即两个Series对象。

如果你写了一些改进,那就是: if distdf.loc[i, 'DISTINGUISH']==distdf.loc[i+1, 'DISTINGUISH']:, 即比较每一行中的 DISTINGUISH 元素(当前和下一个)。

但是这段代码在循环的最后一圈也会失败,因为 当你“停留”在最后一行时,没有下一行,那么 KeyError 引发异常。

有一种更简单、更 pandasonic 的方法来获取您的值列表, 没有任何循环。

假设您的 DataFrame (distdf) 包含:

    DISTINGUISH
0             1
1             1
2             2
3             2
4             3
5             3
6            32
7            32
8            33
9            33
10           34
11           34

由于您想对其唯一的列进行操作,以保持代码简短, 让我们把它保存在 col0 下:

col0 = distdf.iloc[:, 0]

然后,要获取您的值列表,无需任何循环,运行:

np.where(col0 == col0.shift(-1), 'true', 'no')

上述数据的结果是:

array(['true', 'no', 'true', 'no', 'true', 'no', 'true', 'no', 'true',
       'no', 'true', 'no'], dtype='<U4')

【讨论】:

【参考方案2】:

尽管您只有一列,distdf.loc[i] 仍然是 Pandas Series 对象,而不仅仅是包含在唯一列中的整数,因此会出现错误。

您可以做的是使用.values 比较单个列的每个单元格的值以避免出现此错误:

# you also need to use len(distdf)-1 and not len(distdf)
for i in range(len(distdf)-1):
    if distdf.loc[i].values == distdf.loc[i+1].values:
        print("true")
    else:
        print('no')

【讨论】:

【参考方案3】:
dist =[1,2,3,4,5,6]
distdf = pd.DataFrame(dist)
for i in range(len(distdf)-1):
    res = distdf.loc[i].values==distdf.loc[i].values
    if True in res:
        print("true")
    else:
        print('no')   

【讨论】:

虽然您的解决方案可能会解决问题,但请解释为什么它可以使其更有效

以上是关于pandas 错误:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()的主要内容,如果未能解决你的问题,请参考以下文章

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

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

ValueError:在将 lambda 与 loc 一起使用时,Series 的真值不明确 [重复]

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

DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]

ValueError: Series 的真值不明确(API NaN 处理)