使用运算符链式调用删除pandas DataFrame指定字符串为何部分失效
问题原因
- 你用的
!=是精确文本匹配运算符,写在单引号里的正则表达式会被当作普通字符串匹配,只有Sorte列值和你写的正则字符串完全一致的行才会被过滤,自然无法实现「包含指定子串就删除」的模糊匹配效果,这就是只有前几个固定字符串过滤生效、正则相关规则不生效的核心原因。 - 链式写法本身没有问题,错误来自匹配逻辑的方法选择错误。
正确实现方案
pandas中需要使用Series.str.contains()方法实现正则匹配,优化后的写法如下:
- 先定义两类过滤规则,提高可读性
# 需要精确匹配排除的字符串 exact_exclude = [ 'sonstige', 'verauslagte Portokosten', 'erhaltenenzahlung Re vom', 'geleistetenzahlung aus Re-Nr' ] # 需要正则模糊匹配排除的模式 regex_exclude = [ r'^.*Holzkisten geliefert.*$', r'^.*Infomaterialktionspakete.*$', r'^.*Aloe Vera haben wir nicht im Sortiment.*$', r'^.*Anzeigenvorlage Planten ut`norden.*$' ]
- 组合条件过滤,仍保持链式写法不生成多余副本
mask = ~file_df['Sorte'].isin(exact_exclude) & ~file_df['Sorte'].str.contains('|'.join(regex_exclude), na=False, regex=True) file_df = file_df[mask]
参数说明
na=False:如果Sorte列存在空值,该参数会将空值的匹配结果设为False,避免布尔索引报错regex=True:明确开启正则匹配模式,|是正则的或逻辑符,只要匹配任意一个规则的行都会被排除
验证方法
可以单独测试某条正则规则是否生效,比如执行:
print(file_df[file_df['Sorte'].str.contains(r'^.*Holzkisten geliefert.*$', na=False)])
确认输出的行都是你需要删除的目标行后,再组合所有规则即可。
内容的提问来源于stack exchange,提问作者jeiglsperger
相关产品推荐
相关产品推荐

