python 如何在Pandas过滤函数中反转正则表达式

eqzww0vc  于 2023-01-29  发布在  Python
关注(0)|答案(4)|浏览(97)

我有下面的panda Dataframe df(实际上这只是一个更大的 Dataframe 的最后几行):

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).

    • 是否有一种方法可以更简单地指定我想要初始正则表达式的逆表达式?**
    • 这种基于regexp的筛选有效吗?**

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

df.filter(regex="(?!^__)", axis=0)df.filter(regex="^\w+", axis=0)都返回所有行。
根据re模块文档,\w特殊字符实际上包括下划线,这解释了第二个表达式的行为。
我猜第一个方法不起作用,因为(?!...)适用于遵循模式的内容。这里,"^"应该放在外面,如下面提出的解决方案:
df.filter(regex="^(?!__).*?$", axis=0)工作。
df.filter(regex="^(?!__)", axis=0)也是如此。

wn9m85ua

wn9m85ua1#

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

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

az31mfrm2#

匹配所有没有两个前导下划线的行:
^(?!__)
^匹配行的开头(?!__)确保该行(前一个^匹配项之后的行)不以两个下划线开头

**编辑:**删除了.*?$,因为不需要过滤行。

piok6c0g

piok6c0g3#

这里有两种可能性:

(?!^__) # 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
laik7k3q

laik7k3q4#

反向选择多列(A、B、C)。

df.filter(regex=r'^(?!(A_|B_.*_|C_.*_.*_))',axis='columns')

相关问题