为了账号安全,请及时绑定邮箱和手机立即绑定

当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作

当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作

慕姐4208626 2022-10-11 15:10:11
import pandas as pdimport numpy as npdf = pd.DataFrame({'Li':[[1,2],[5,6],[8,9]],'Tu':[(1,2),(5,6),(8,9)]}df       Li      Tu0  [1, 2]  (1, 2)1  [5, 6]  (5, 6)2  [8, 9]  (8, 9)工作正常Tupledf.Tu == (1,2)0     True1    False2    FalseName: Tu, dtype: bool当List它给出值错误时df.Li == [1,2]ValueError:长度必须匹配才能进行比较
查看完整描述

3 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

问题是lists 不可散列,因此有必要比较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]


查看完整回答
反对 回复 2022-10-11
?
PIPIONE

TA贡献1829条经验 获得超9个赞

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


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


您无法将大小为 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

总而言之,这似乎是熊猫方面的一个错误。


查看完整回答
反对 回复 2022-10-11
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我的列 'vectors' 包含 numpy ndarrays,当我想与另一个 ndarray 'centroid' 进行比较时,我得到了同样的错误。以下适用于 numpy ndarrays:

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

这也适用于列表:

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


查看完整回答
反对 回复 2022-10-11
  • 3 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信