鉴于...
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
如果你有很多项目,最后一个可能会很管用。
所以我的问题是:有没有更接近第一个的方法,我可以将关键字/过滤器保存到列表中,并更轻松地过滤包含该列表所有项目的每行数据框?
感谢您的帮助!
答案 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)]