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

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:长度必须匹配才能进行比较


慕姐4208626
浏览 124回答 3
3回答

蝴蝶不菲

问题是lists 不可散列,因此有必要比较tuples:print (df.Li.map(tuple) == (1,2))0     True1    False2    FalseName: Li, dtype: bool或者在列表理解中:mask = [tuple(x) == (1,2) for x in df.Li]#alternativemask = [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]

PIPIONE

问题是 pandas 正在考虑[1, 2]作为一个类似系列的对象,并试图将 的每个元素df.Li与 的每个元素进行比较[1, 2],因此出现错误:ValueError:长度必须匹配才能进行比较您无法将大小为 2 的列表与大小为 3 ( df.Li) 的列表进行比较。为了验证这一点,您可以执行以下操作:print(df.Li == [1, 2, 3])输出0    False1    False2    FalseName: 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     True1    False2    FalseName: Li, dtype: bool总而言之,这似乎是熊猫方面的一个错误。

一只斗牛犬

我的列 '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])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python