在pandas DataFrame中使用比较列表时出现问题

5

我有一个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

这里发生了什么?我该如何进行列表比较?

1
你的第一个比较方法行不通,因为没有将序列转换成列表进行比较。而第二个方法是可行的,因为返回的是元素内容即列表,可以进行比较。你能解释一下你想要实现什么吗? - EdChum
@EdChum d['d'] 返回一个 listSeries,然后该操作将每个元素与右侧进行比较。我期望返回的序列是 [True,False],因为第一行在列 d 上有相同的列表,而第二行没有。但实际上我得到了 [false, false],这对我来说没有意义。 - Mike
2
这不是一个错误,而是列表语法用于整个系列的比较。这是有道理的,因为您不是将每个元素与[4,5]进行比较,而是将第一个元素与4进行比较(它不是)并将第二个元素与5进行比较(它不是)。因此:[False,False]。如果您想要类似的行为,我猜您可以使用元组:df["d"] == (4,5)会按您想要的方式工作。pandas实际上不支持非标量条目。 - DSM
如果您这样做:df.d == [[4,5],[4,5]],那么 DSM 是正确的,它会按照您的预期执行,但语法不太灵活。 - EdChum
@DSM 好的,那很有道理,元组似乎是正确的选择。 - Mike
显示剩余3条评论
2个回答

4

这是一个奇怪的问题,可能与列表不可哈希有关。 我建议使用“apply”:

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)

另一种解决方案是使用“列表推导式”(list comprehension):
df[[x == [4, 5] for v in df['col2']]]

0
作为一种替代方案,如果您希望保留您的“列表系列”结构,您可以将您的系列转换为元组仅用于比较目的。这可以通过 pd.Series.apply 实现:
>>>>df['d'].apply(tuple) == (4, 5)

0     True
1    False
Name: d, dtype: bool

然而,请注意一点,对于一系列列表中可用的选项均不是矢量化的。建议在执行比较之前将数据拆分为数字系列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接