Python 当列包含“列表”而不是“元组”时,比较运算符“==”未按预期工作` 将熊猫作为pd导入 将numpy作为np导入 数据帧({'Li':[[1,2],[5,6],[8,9]],'Tu':[(1,2)、(5,6)、(8,9)]) df 李图 0 [1, 2] (1, 2) 1 [5, 6] (5, 6) 2 [8, 9] (8, 9)

Python 当列包含“列表”而不是“元组”时,比较运算符“==”未按预期工作` 将熊猫作为pd导入 将numpy作为np导入 数据帧({'Li':[[1,2],[5,6],[8,9]],'Tu':[(1,2)、(5,6)、(8,9)]) df 李图 0 [1, 2] (1, 2) 1 [5, 6] (5, 6) 2 [8, 9] (8, 9),python,pandas,list,tuples,comparison-operators,Python,Pandas,List,Tuples,Comparison Operators,对于元组 df.Tu==(1,2) 0对 1错误 2错误 姓名:Tu,数据类型:bool 当其列表给出值错误时 df.Li==[1,2] ValueError:长度必须匹配才能进行比较 问题是lists不可散列,因此有必要比较tuples: print (df.Li.map(tuple) == (1,2)) 0 True 1 False 2 False Name: Li, dtype: bool 或在列表理解中: mask = [tuple(x) == (1,2) fo

对于
元组

df.Tu==(1,2)
0对
1错误
2错误
姓名:Tu,数据类型:bool
当其
列表
给出值错误时

df.Li==[1,2]
ValueError:长度必须匹配才能进行比较


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

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]

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

ValueError:长度必须匹配才能进行比较

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

print(df.Li == [1, 2, 3])
# 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    False
1    False
2    False
Name: Li, dtype: bool
0     True
1    False
2    False
Name: Li, dtype: bool
它不会抛出任何错误并正常工作,但会按预期返回所有的
False
。为了使用列表进行比较,您可以执行以下操作:

print(df.Li == [1, 2, 3])
# 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    False
1    False
2    False
Name: Li, dtype: bool
0     True
1    False
2    False
Name: Li, dtype: bool

总而言之,它看起来像熊猫那边的一个bug。

我的列“向量”包含numpy ndarray,当我想与另一个ndarray“质心”进行比较时,我得到了相同的错误。以下适用于numpy ndarray:

df['vectors'].apply(lambda x: ((vec==centroid).sum() == centroid.shape[0]))
这也适用于列表:

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

明白了。我只是想知道为什么
list
不起作用的解释。这对我来说也是有效的
df.Li.apply(lambda x:(x==[1,2]))
“所以这里把
Tuple
看作标量,把
list
看作序列”是吗?@anonymous是的,我相信是这样。