我有一个如下所示的数据框。
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'")
给出了错误。
如何编写“标签”列的查询。
答案 0 :(得分:1)
您不能使用pd.DataFrame.query
测试一系列列表中列表中字符串的成员资格。不建议在熊猫数据框中保存列表,因为这样会丢失矢量化功能。
对于现有数据框,您可以改为使用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'}]
最后一个选项虽然昂贵,但可能适合测试多个标签的存在。在每种情况下,我们都将构造一个布尔序列,然后将其用于屏蔽数据框。