【问题标题】:Filter Pandas dataframe by column name on regex patterns using str.contains使用 str.contains 按正则表达式模式上的列名过滤 Pandas 数据框
【发布时间】:2021-10-22 08:40:34
【问题描述】:

我想在数据框中查找与字符串模式匹配的列。我特别想找到两个部分,首先找到包含“WORDABC”的列,然后我想找到也是该列的“1”值的列(即“WORDABC1”)。为此,我一直在使用.str.contains Pandas 函数。

我的问题是当有两个数字时,例如“11”或“13”。

df = pd.DataFrame({'WORDABC1': {0: 1, 1: 2, 2: 3},
 'WORDABC11': {0: 4, 1: 5, 2: 6},
 'WORDABC8N123': {0: 7, 1: 8, 2: 9},
 'WORDABC81N123': {0: 10, 1: 11, 2: 12},
 'WORDABC9N123': {0: 13, 1: 14, 2: 15},
 'WORDABC99N123': {0: 16, 1: 17, 2: 18}})

尝试搜索包含“WORDABC1”的列会给出两个结果,“WORDABC1”和

df[df.columns[df.columns.str.contains(pat = 'WORDABC1')]]

   WORDABC1  WORDABC11
0         1          4
1         2          5
2         3          6
df[df.columns[df.columns.str.contains(pat = 'WORDABC1\\b')]]

   WORDABC1
0         1
1         2
2         3

对于上面的示例,它适用于我。但是,如果在我找到的模式之后有更多字符,就会出现我的问题。

df[df.columns[df.columns.str.contains(pat = 'WORDABC9')]]
   WORDABC9N123  WORDABC99N123
0            13             16
1            14             17
2            15             18

df[df.columns[df.columns.str.contains(pat = 'WORDABC9\\b')]]
Empty DataFrame
Columns: []
Index: [0, 1, 2]

我只想要“WORDABC9N123”列,而不能只删除另一列。我曾考虑过只使用df[df.columns[df.columns.str.contains(pat = 'WORDABC9')][0]] 来获得我想要的系列,但这会产生另一个问题。

我也一直在使用诸如(df.columns.str.contains(pat = 'WORDABC1\\b')).sum() 之类的东西来创建真值陈述,所以上面的df[0] 方法并不能帮助我解决这个问题。

有没有更好的方法来代替 str.contains?还是我的正则表达式不正确?谢谢!

【问题讨论】:

  • 目前还不清楚规则是什么。只是模式的末尾不能有额外的数字吗?

标签: python regex pandas dataframe


【解决方案1】:

尝试.filterregex= 参数:

print(df.filter(regex=r"WORDABC9(?=[^\d]|$)"))

打印:

   WORDABC9N123
0            13
1            14
2            15

【讨论】:

  • 谢谢!这对我有用。所以对于这个表达式,在找到 WORDABC9 之后,我们会进行正向前瞻,我们会查找 1 个不是数字的字符,或者它不是行尾。这很有意义。我会继续练习更多的正则表达式!
【解决方案2】:

pat = 'WORDABC1\\b' 在匹配 'WORDABC1' 时有效,因为 \\b 匹配单词边界,并且字符串的结尾是单词边界。

如果您想匹配'WORDABC9N123' 而不是'WORDABC99N123',则类似的模式'WORDABC9\\b' 将不起作用,因为在这两种情况下都没有单词边界。

我想你想匹配WORDABC9 后跟一个非数字,在这种情况下你可以试试pat = 'WORDABC9[\\b | \\D]'。这将匹配WORDABC9WORDABC9N...,但不匹配WORDABC99N123

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2021-07-01
    • 2019-05-06
    • 1970-01-01
    • 2014-12-17
    • 2020-03-21
    • 2018-01-11
    • 2018-04-30
    相关资源
    最近更新 更多