当前位置: 首页 > 知识库问答 >
问题:

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

单于旭东
2023-03-14

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

但我有一个错误。

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

我怎样才能修好它?

共有3个答案

皇甫展
2023-03-14
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')   
张嘉
2023-03-14

尽管您只有一列,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')
庾和昶
2023-03-14

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

如果您编写:如果distdf.loc[i,'distince']==distdf.loc[i 1,'distince']:,即比较每一行(当前行和下一行)中的distince元素,则会有一些改进。

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

有一种更简单、更泛泛的方法来获取您的值列表,而不需要任何循环。

假设您的数据帧(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')
 类似资料: