查询具有值为列表的pandas数据帧列

Vis*_*P.S 5 python dataframe python-3.x pandas

我有一个数据框如下所示.

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'])
Run Code Online (Sandbox Code Playgroud)

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

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

如何为列'tags'编写查询.

jpp*_*jpp 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]
Run Code Online (Sandbox Code Playgroud)

或者您可以使用列表理解:

res = df[['apple' in x for x in df['tags']]]
Run Code Online (Sandbox Code Playgroud)

第三种选择是使用set

res = df[df['tags'].apply(set) >= {'apple'}]
Run Code Online (Sandbox Code Playgroud)

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