使用负向零宽断言过滤Pandas列未生效,求原因及解决方法
问题分析与解决
你的正则表达式(?<!bad).*未能生效的核心原因是逻辑偏差:它匹配的是任意位置前不是bad的字符序列,而bad_one这类列名中,除开头的bad外,后续的_one等部分都满足“前面不是bad”的条件,因此会被错误匹配。
正确解决方法
方法1:使用负向预查正则
要筛选不以bad开头的列,需针对列名的起始位置做判断,用^(?!bad)正则即可:
df.filter(regex=r'^(?!bad)')
输出结果:
good_one 0 1 1 2 2 3
^表示列名的起始位置,(?!bad)是负向预查断言,确保起始位置后不是bad,仅开头非bad的列会被选中。
方法2:用字符串方法筛选(更直观)
若觉得正则晦涩,可直接用Pandas字符串方法结合布尔索引:
df.loc[:, ~df.columns.str.startswith('bad')]
通过str.startswith('bad')判断列名是否以bad开头,再用~取反,最终筛选出符合要求的列,结果与上述一致。
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

