Python 在数据帧中使用比较列表的问题

Python 在数据帧中使用比较列表的问题,python,pandas,Python,Pandas,我在pandas中有一个DataFrame,其中一个列类型是int上的列表,如下所示: df = pandas.DataFrame([[1,2,3,[4,5]],[6,7,8,[9,10]]], columns=['a','b','c','d']) >>> df a b c d 0 1 2 3 [4, 5] 1 6 7 8 [9, 10] 我想使用d构建一个过滤器,但正常的比较操作似乎不起作用: >>> df['d'

我在pandas中有一个DataFrame,其中一个列类型是int上的列表,如下所示:

df = pandas.DataFrame([[1,2,3,[4,5]],[6,7,8,[9,10]]], columns=['a','b','c','d'])
>>> df
   a  b  c        d
0  1  2  3   [4, 5]
1  6  7  8  [9, 10]
我想使用d构建一个过滤器,但正常的比较操作似乎不起作用:

>>> df['d'] == [4,5]
0    False
1    False
Name: d, dtype: bool
然而,当我一行一行地检查时,我得到了我期望的结果

>>> df.loc[0,'d'] == [4,5]
True

这是怎么回事?如何进行列表比较?

这是一个奇怪的问题,它可能与列表不可散列这一事实有关 我会申请:

df['d'].apply(lambda x: x == [4,5])
当然,根据DSM的建议,以下工作:

df = pd.DataFrame([[1,2,3,(4,5)],[6,7,8,(9,10)]], columns=['a','b','c','d'])
df['d'] == (4,5)
另一个解决方案是使用
列表理解

df[[x == [4, 5] for v in df['col2']]]

另外,如果希望保持“列表系列”结构,则可以将系列转换为元组,仅用于比较目的。这可以通过以下方式实现:


但是,请注意,对于一系列列表,没有一个可用的选项是矢量化的。建议您在执行比较之前将数据拆分为数字系列。

第一次比较不起作用,因为没有从系列到列表的转换来进行比较。第二种方法之所以有效,是因为返回的元素内容是列表,因此可以进行比较。你能解释一下你想说什么吗achieve@EdChum
d['d']
返回
列表的
系列
,然后操作将每个元素与右侧进行比较。我希望返回序列是
[True,False]
,因为列
d
的第一行有相同的列表,而第二行没有。相反,我得到的是
[false,false]
,这对我来说毫无意义。这可能是一个bug,对此不确定,列表对象的存在可能会混淆它,可能是因为列表无法散列。如果您存储了一个dict,那么比较工作:
df=pd.DataFrame([[1,2,3,{'a':[4,5]}],[6,7,8,{'a':[9,10]}]],columns=['a','b','c','d'])df.d={'a':[4,5]}
我并不是说这是一个解决方案,这不是一个bug,而是列表语法用于整个系列的比较。这很有意义,因为您不是将每个元素与
[4,5]
进行比较,而是将第一个元素与4(不是)进行比较,将第二个元素与5(不是)进行比较。因此:
[False,False]
。如果你想要类似的行为,你可以使用元组,我想:
df[“d”]==(4,5)
会按照你想要的方式工作
pandas
实际上不支持非标量项。同样,如果存储元组而不是列表,它也可以工作
>>>>df['d'].apply(tuple) == (4, 5)

0     True
1    False
Name: d, dtype: bool