pandas比较运算符`==`当列包含`List`而不是'Tuple`时无法正常工作

问题描述 投票:2回答:2
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:长度必须匹配才能进行比较

python pandas list tuples comparison-operators
2个回答
2
投票

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

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]

1
投票

问题是熊猫正在将[1, 2]视为series-like对象,并试图将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

总的来说,在熊猫方面似乎像是一个[[bug。

© www.soinside.com 2019 - 2024. All rights reserved.