如何筛选DataFrame中同时含指定子串且无禁用子串的行
解决方法
我们通过逐行匹配三个规则即可完成筛选,Pandas实现代码如下:
import pandas as pd # 指定需要做子串匹配的列,这里排除数值列cap check_cols = ['1', '2', '3', '4'] # 规则1:行内存在包含Coin子串的单元格 has_coin = df[check_cols].apply(lambda s: s.str.contains('Coin', na=False)).any(axis=1) # 规则2:行内存在包含Charge子串的单元格 has_charge = df[check_cols].apply(lambda s: s.str.contains('Charge', na=False)).any(axis=1) # 规则3:行内不存在包含Bill、Other子串的单元格 no_invalid = ~df[check_cols].apply(lambda s: s.str.contains('Bill|Other', na=False)).any(axis=1) # 同时满足三个规则的行即为最终结果 df_res = df[has_coin & has_charge & no_invalid]
代码说明
str.contains的na=False参数会直接将空单元格判定为不匹配目标子串,正好符合需求中空值允许的要求。Bill|Other是正则语法,表示匹配两个子串中的任意一个,不需要额外写两次匹配逻辑。
运行后得到的结果与示例完全一致:
>>> df_res 1 2 3 4 cap 2 Charge Coin 1 5 Coin Charge 8 8 Charge Coin 15
内容的提问来源于stack exchange,提问作者DrakeMurdoch
相关产品推荐
相关产品推荐

