簡體   English   中英

當列包含“List”而不是“Tuple”時,pandas 比較運算符“==”無法按預期工作

[英]pandas comparision operator `==` not working as expected when column contain `List` instead `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:長度必須匹配才能進行比較

問題是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]

問題是 pandas 將[1, 2]視為類似系列的object 並嘗試將df.Li的每個元素與[1, 2]的每個元素進行比較,因此出現錯誤:

ValueError:長度必須匹配才能進行比較

您無法將大小為 2 的列表與大小為 3 ( df.Li ) 的列表進行比較。 為了驗證這一點,您可以執行以下操作:

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

Output

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)

Output

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

總而言之,這似乎是 pandas 方面的一個錯誤

我的列“向量”包含 numpy ndarray,當我想與另一個 ndarray 的“質心”進行比較時,我遇到了同樣的錯誤。 以下適用於 numpy ndarray:

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

這也適用於列表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM