过滤数据框:特定列包含特定列表的所有子字符串

时间:2021-03-13 20:54:44

标签: python python-3.x pandas dataframe

鉴于...

    target_column
1   XXX   
2   YYY
3   XXX YYY
4   ZZZ 
5   PPP XXX

当我想通过包含列表中任何项目的列过滤数据框时,这就是我所做的:

filters = ["YYY", "XXX"]
mask = data["target_column"].str.contains("|".join(filters))
data.loc[mask]

输出:

    target_column
1   XXX   
2   YYY
3   XXX YYY
5   PPP XXX

当我想通过包含列表中所有项目的列过滤数据框时,这就是我所做的:

mask = (data["target_column"].str.contains("YYY")) & \
       (data["target_column"].str.contains("XXX"))
data.loc[mask]

输出:

    target_column
3   XXX YYY

如果你有很多项目,最后一个可能会很管用。

所以我的问题是:有没有更接近第一个的方法,我可以将关键字/过滤器保存到列表中,并更轻松地过滤包含该列表所有项目的每行数据框?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

因为您可以将正则表达式传递给 str.contains,所以您可以这样做:

filters = ["YYY", "XXX"]
mask = data["target_column"].str.contains(f'(?=.*{filters[0]})(?=.*{filters[1]})') 

输出data.loc[mask]

<头>
target_column
2 XXX YYY

答案 1 :(得分:1)

试试这个:

df.loc[df['target_column'].str.get_dummies(sep=' ').loc[:,filters].gt(0).all(axis=1)]