【问题标题】:Querying a pandas dataframe column which has values as list查询具有列表值的 pandas 数据框列
【发布时间】:2018-06-21 10:26:02
【问题描述】:

我有一个如下所示的数据框。

import pandas as pd


raw_data = {'score': [1,2,3], 
        'tags': [['apple','pear','guava'],['truck','car','plane'],['cat','dog','mouse']]}


df = pd.DataFrame(raw_data, columns = ['score', 'tags'])

df.query("score==1") 给出第一行作为结果。

但是df.query("tags='apple'") 给出了错误。

如何为“标签”列编写查询。

【问题讨论】:

  • 您已将列表存储在 df 中,query 方法无法评估您的表达式来处理此问题。要过滤 df,您需要执行 df[df['tags'].apply(lambda x: 'apple' in x)]。在 df 中存储非标量值是无效的,你不能指望通常的 pandas 操作像正常一样工作
  • @EdChum,哎呀,同时编辑了我的帖子。但我也将添加另一种选择:)
  • @jpp 不用担心,我确信这是一个骗局,尽管不是专门用于让 query 处理列表

标签: python python-3.x pandas dataframe


【解决方案1】:

您不能使用pd.DataFrame.query 来测试字符串在一系列列表中的列表中的成员资格。不建议在 Pandas 数据框中保存列表,因为您会失去矢量化功能。

使用现有数据框,您可以改为使用 pd.Series.apply 计算掩码:

res = df[df['tags'].apply(lambda x: 'apple' in x)]

print(res)

   score                  tags
0      1  [apple, pear, guava]

或者您可以使用列表推导:

res = df[['apple' in x for x in df['tags']]]

第三种选择是使用set

res = df[df['tags'].apply(set) >= {'apple'}]

最后一个选项虽然昂贵,但可能适合您测试是否存在多个标签。在每种情况下,我们都在构建一个布尔序列,然后我们用它来屏蔽数据帧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2020-07-18
    • 1970-01-01
    • 2018-07-13
    • 2018-02-05
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多