当列包含“列表”而不是“元组”时,比较运算符“==”未按预期工作`

2024-06-26 07:09:20 发布

您现在位置:Python中文网/ 问答频道 /正文

import pandas as pd
import numpy as np

df = pd.DataFrame({'Li':[[1,2],[5,6],[8,9]],'Tu':[(1,2),(5,6),(8,9)]}
df
       Li      Tu
0  [1, 2]  (1, 2)
1  [5, 6]  (5, 6)
2  [8, 9]  (8, 9)

Tuple工作罚款

df.Tu == (1,2)
0     True
1    False
2    False
Name: Tu, dtype: bool

当其List时,它给出值错误

df.Li == [1,2]

ValueError: Lengths must match to compare


Tags: nameimportnumpyfalsetruedataframepandasdf
3条回答

问题是pandas将[1, 2]视为类似于对象的系列,并试图将df.Li的每个元素与[1, 2]的每个元素进行比较,因此出现错误:

ValueError: Lengths must match to compare

无法将大小为2的列表与大小为3的列表进行比较(df.Li)。为了验证这一点,您可以执行以下操作:

print(df.Li == [1, 2, 3])

输出

0    False
1    False
2    False
Name: Li, dtype: bool

它不会抛出任何错误并正常工作,但会按预期返回False。要使用列表进行比较,可以执行以下操作:

# this creates an array where each element is [1, 2]
data = np.empty(3, dtype=np.object)
data[:] = [[1, 2] for _ in range(3)]

print(df.Li == data)

输出

0     True
1    False
2    False
Name: Li, dtype: bool

总的来说,它看起来像熊猫那边的一只虫子

问题是list是不可散列的,因此有必要比较tuples:

print (df.Li.map(tuple) == (1,2))
0     True
1    False
2    False
Name: Li, dtype: bool

或在列表理解中:

mask = [tuple(x) == (1,2) for x in df.Li]
#alternative
mask = [x == [1,2] for x in df.Li]
print (mask)
[True, False, False]

如果所有列表的长度相同:

mask = (np.array(df.Li.tolist()) == [1,2]).all(axis=1)
print (mask)
[ True False False]

我的列“vectors”包含numpy ndarray,当我想与另一个ndarray“centroid”进行比较时,我得到了相同的错误。numpy Ndarays的以下工程:

df['vectors'].apply(lambda x: ((vec==centroid).sum() == centroid.shape[0]))

这也适用于列表:

df.Li.apply(lambda x: x==[1,2])

相关问题 更多 >