如何在熊猫过滤器函数中反转正则表达式

Posted

技术标签:

【中文标题】如何在熊猫过滤器函数中反转正则表达式【英文标题】:How to invert a regular expression in pandas filter function 【发布时间】:2017-04-25 05:46:27 【问题描述】:

我有以下 pandas 数据框 df(实际上只是更大数据框的最后几行):

                           count
gene                            
WBGene00236788                56
WBGene00236807                 3
WBGene00249816                12
WBGene00249825                20
WBGene00255543                 6
__no_feature            11697881
__ambiguous                 1353
__too_low_aQual                0
__not_aligned                  0
__alignment_not_unique         0

我可以使用filterregex 选项仅获取以下划线开头的行:

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="^[^_][^_]", axis=0)

有没有办法更简单地指定我想要初始正则表达式的逆?

这种基于正则表达式的过滤效率高吗?

编辑:测试一些建议的解决方案

df.filter(regex="(?!^__)", axis=0)df.filter(regex="^\w+", axis=0) 都返回所有行。

根据re 模块文档,\w 特殊字符实际上包含下划线,它解释了第二个表达式的行为。

我猜第一个不起作用,因为(?!...) 适用于遵循模式的内容。在这里,“^”应该放在外面,如以下建议的解决方案:

df.filter(regex="^(?!__).*?$", axis=0) 有效。

df.filter(regex="^(?!__)", axis=0) 也是如此。

【问题讨论】:

(?!^__) 可能是您正在寻找的。或者,也许更好:^\w+ 您可以只使用下划线从数据框中获取索引并将它们从原始数据框中排除。 “新”索引可以像这样收集:[idx for idx in original_df.index if idx not in underscore_df.index] 这有很多零匹配。更好:^(?!__).*?$ @RobinKoch:懒惰的点星很贵,这里不需要。 (?!^__) 选择所有行,因为它匹配每个没有后跟新行和两个下划线的空字符串。所以基本上一切。 【参考方案1】:

我遇到了同样的问题,但我想过滤列。因此我使用的是axis=1,但概念应该是相似的。

df.drop(df.filter(regex='my_expression').columns,axis=1)

【讨论】:

【参考方案2】:

匹配没有两个前导下划线的所有行:

^(?!__)

^ 匹配行首 (?!__)确保该行(前面的 ^ 匹配之后的内容)不以两个下划线开头

编辑: 删除了.*?$,因为没有必要过滤这些行。

【讨论】:

懒人点星很贵,这里不需要 ^(?!__) 也有效,避免了可能昂贵的明星。 对,我考虑的是匹配行而不是过滤。【参考方案3】:

你有两种可能:

(?!^__) # a negative lookahead
        # making sure that there are no underscores right at the beginning of the line

或者:

^\w+  # match word characters, aka a-z, A-Z, 0-9 at least once

【讨论】:

奇怪的是,这些都不起作用:所有行都被选中。 我想我明白了原因:请参阅问题末尾的编辑。

以上是关于如何在熊猫过滤器函数中反转正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式或熊猫过滤 NLTK 的 FreqDist 计数器

使用正则表达式过滤熊猫

带有熊猫的日期正则表达式过滤器不起作用

了解熊猫系列提取函数中的正则表达式

在熊猫数据框上应用正则表达式函数

如何使用选择性正则表达式在熊猫系列中执行替换?