首页 > 解决方案 > 使用 str.contains 按正则表达式模式上的列名过滤 Pandas 数据框

问题描述

我想在数据框中找到与字符串模式匹配的列。我特别想找到两个部分,首先找到包含“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?还是我的正则表达式不正确?谢谢!

标签: pythonregexpandasdataframe

解决方案


尝试.filter使用regex=参数:

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

印刷:

   WORDABC9N123
0            13
1            14
2            15

推荐阅读