【问题标题】:Issues using compare lists in pandas DataFrame在 pandas DataFrame 中使用比较列表的问题
【发布时间】:2014-09-01 13:54:43
【问题描述】:

我在 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

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

【问题讨论】:

  • 您的第一次比较将无法进行,因为没有从系列转换为比较列表。第二个有效,因为返回的元素内容是列表,因此可以进行比较。你能解释一下你想要达到的目标吗
  • @EdChum d['d'] 返回Serieslist,然后该操作将每个元素与右侧进行比较。我希望返回系列为[True,False],因为d 列的第一行具有相同的列表,而第二行没有。相反,我得到了[false, false],这对我来说没有意义。
  • 这可能是一个错误,不确定这个,列表对象的存在可能会混淆它,可能是因为列表不能被散列。如果您改为存储字典,则比较有效: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 并不真正支持非标量条目。
  • 同样,如果你存储元组而不是列表,它也可以工作

标签: python pandas


【解决方案1】:

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

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']]]

【讨论】:

    【解决方案2】:

    作为替代方案,如果您希望保留“列表系列”结构,您可以将您的系列转换为元组,仅用于比较目的。这可以通过pd.Series.apply:

    >>>>df['d'].apply(tuple) == (4, 5)
    
    0     True
    1    False
    Name: d, dtype: bool
    

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

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      相关资源
      最近更新 更多