【问题标题】:Pandas .loc with list values throwing "ValueError: Lengths must match to compare" error带有列表值的 Pandas .loc 抛出“ValueError:长度必须匹配才能比较”错误
【发布时间】:2019-11-27 09:05:17
【问题描述】:

我目前有一个 Pandas DataFrame,其中列有值列表。有些值是非空列表,有些是空列表。我只想提取包含此特定列的非空列表的行,但在运行我希望完成这项工作的代码时出现错误。

我运行的代码是:

df.loc[df['column'] != []]

这给了我错误:

ValueError: Lengths must match to compare.

考虑到错误信息,我尝试了:

df.loc[len(df['column']) != 0]

得到

KeyError: True

我有点困惑,因为我认为我最初的尝试会奏效,但我不确定到底是什么问题。我该如何处理这个问题?提前致谢。

编辑

我实际上只是注意到,每次我尝试使用列表列中的任何值执行 df.loc 操作时都会收到 ValueError: Lengths must match to compare 错误。

【问题讨论】:

  • 你有 df[0:2].to_dict() 可以分享来评估吗?
  • 您是否要获取该系列的所有 True 值的长度,然后查找该位置
  • 我又偶然发现了这里,但我想你忘了将答案标记为已接受!

标签: python pandas


【解决方案1】:

试试这个我在我拥有的数据框上带有空列表的列上测试:

df[df['column'].astype(str) != '[]']

【讨论】:

  • 可能比使用 apply 更快,甚至适用于 list 包含 numpy.nan 的情况。奇怪的是 Pandas 没有提供更好的方法来比较列表的列。
【解决方案2】:

您放入loc 中的部分需要返回一个列表,即只要您的数据框中存在具有TrueFalse 值的行。这就是它选择正确行的方式。

您的问题是 df['column'] != [] 无法完成,因为它想逐个元素地比较这两个元素。

len(df['column']) != 0 也不起作用,因为这会返回一个值(True,因为列中有多个值)。

您需要有一个包含列表长度的列表,例如df['column'].apply(lambda x:len(x)),您现在可以将其与 0 进行比较。

这是您可以运行的示例:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'trial_num': [1, 2, 3, 1, 2, 3],
     'subject': [1, 1, 1, 2, 2, 2],
     'column': [list(np.random.randn(3).round(2)) for i in range(6)]
    }
)

df["column"][3] = []
print(df["trial_num"] == [1,2,3,4,5,6])
print(df['column'].apply(lambda x:len(x)) != 0)
print(df.loc[df['column'].apply(lambda x:len(x)) != 0])

【讨论】:

    【解决方案3】:

    你可以试试

    df.loc[df['column'].str.len() != 0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-25
      • 2016-04-07
      • 2017-04-12
      • 2019-08-24
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      相关资源
      最近更新 更多