Python 如何在过滤器函数中反转正则表达式
我有以下熊猫数据帧Python 如何在过滤器函数中反转正则表达式,python,regex,pandas,Python,Regex,Pandas,我有以下熊猫数据帧df(这实际上只是一个大得多的数据帧的最后几行): 我可以使用filter的regex选项仅获取以两个下划线开头的行: df.filter(regex="^__", axis=0) 这将返回以下内容: count gene __no_feature 11697881 __ambiguous 1353 __too_l
df
(这实际上只是一个大得多的数据帧的最后几行):
我可以使用filter
的regex
选项仅获取以两个下划线开头的行:
df.filter(regex="^__", axis=0)
这将返回以下内容:
count
gene
__no_feature 11697881
__ambiguous 1353
__too_low_aQual 0
__not_aligned 0
__alignment_not_unique 0
实际上,我想要的是补语:只有那些不以两个下划线开头的行
我可以用另一个正则表达式来实现这一点:df.filter(regex=“^[^^\u][^\ u]”,axis=0)
有没有更简单的方法来指定我想要初始正则表达式的倒数?
这种基于regexp的过滤效率高吗?
编辑:测试一些建议的解决方案
df.filter(regex=“(?!^ _uuuuuuuu)”,axis=0)
和df.filter(regex=“^\w+”,axis=0)
都返回所有行
根据re
模块文档,\w
特殊字符实际上包括下划线,这解释了第二个表达式的行为
我猜第一个不起作用,因为(?!…)
适用于遵循模式的内容。此处,“^”应放在外部,如以下建议的解决方案所示:
df.filter(regex=“^(?!\uuu)。*?$”,axis=0)
df.filter(regex=“^(?!\uuuu)”,axis=0)也是如此
(?!^__) # a negative lookahead
# making sure that there are no underscores right at the beginning of the line
或:
匹配没有两个前导下划线的所有行:
df.filter(regex="^__", axis=0)
^(?!\uuuuu)
^
匹配行的开头
(?!\uuuu)
确保行(前面的^
匹配后面的内容)不以两个下划线开头
编辑:
删除了*?$
,因为不需要筛选行。我也遇到了同样的问题,但我想筛选列。因此,我使用axis=1,但概念应该类似
df.drop(df.filter(regex='my_expression').columns,axis=1)
(?!^\uuu)
可能就是您要找的。或者,也许更好:^\w+
您可以从带有下划线的数据帧中获取索引,并将其从原始数据帧中排除。“新”索引可以像这样收集:[idx表示原始的_df.index中的idx,如果idx不在下划线_df.index中]
,它有许多零匹配。更好:^(?)。*?$
@RobinKoch:lazy dot star非常昂贵,在这里不需要。(?!^\uu)
选择所有行,因为它匹配每个空字符串,该字符串后面没有新行和两个下划线。所以基本上一切都是这样。懒惰的点星非常昂贵,在这里不需要。^(?!\uu)
也可以工作,并且避免了可能昂贵的星。对,我考虑过匹配行而不是过滤。奇怪的是,这两种工作都不起作用:所有行都被选中。我想我明白了原因:请参阅我问题末尾的编辑。
df.drop(df.filter(regex='my_expression').columns,axis=1)