2 回答

TA贡献1772条经验 获得超6个赞
其实,我错了。看起来这是“python”引擎支持的。
df.query("a == 2 and b.str.contains('|'.join(@my_list))", engine='python')
a b
1 2 type_2
2 2 type_1; type_2
3 2 type_1; type_3
5 2 type_1; type_2, type_3
(旧答案)您的查询可以分为两部分:需要子字符串检查的部分和其他所有内容。
您可以分别计算两个掩码。我建议使用str.contains和DataFrame.eval。然后,您可以 AND 掩码和 filter df。
m1 = df.eval("a == 2")
m2 = df['b'].str.contains('|'.join(my_list))
df[m1 & m2]
a b
1 2 type_2
2 2 type_1; type_2
3 2 type_1; type_3
5 2 type_1; type_2, type_3

TA贡献1865条经验 获得超7个赞
您可以使用str.splitbefore 重新创建您的列表,如列并使用isinand any.Noticeisin是完全匹配的,这意味着如果您 hvae type_11,使用isin它会返回False
df[(pd.DataFrame(df.b.str.split(';').tolist()).isin(my_list).any(1))&(df.a==2)]
Out[88]:
a b
1 2 type_2
2 2 type_1; type_2
3 2 type_1; type_3
5 2 type_1; type_2, type_3
添加回答
举报