python - 使用 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?还是我的正则表达式不正确?谢谢!
解决方案
尝试.filter
使用regex=
参数:
print(df.filter(regex=r"WORDABC9(?=[^\d]|$)"))
印刷:
WORDABC9N123
0 13
1 14
2 15
推荐阅读
- parse-platform - Parse Server - 如何使用云代码从服务器中删除图像文件
- video - 视频最初未在 Chrome 中播放
- angularjs - Angular JS如何按JSON变量过滤
- flutter - 在浮动操作按钮上的 onPressed 回调中从脚手架显示小吃栏
- python - 从一个目录加载所有图像,但打开的文件太多
- c++ - 如何使用 Map 类实现图像配准?
- c# - 在每次构建时使用文件名、测试名及其结果设计数据库
- sql - SQL查询获取当前日期后X天的日期
- angularjs - AngularJs 不允许在转发器中重复。键:未定义
- java - 使用 mockito 的 Unitest Create(Post) 方法