python - 使用带有多个组的 pandas 提取正则表达式
问题描述
我正在尝试从熊猫系列字符串中提取一个数字。例如考虑这个系列:
s = pd.Series(['a-b-1', 'a-b-2', 'c1-d-5', 'c1-d-9', 'e-10-f-1-3.xl', 'e-10-f-2-7.s'])
0 a-b-1
1 a-b-2
2 c1-d-5
3 c1-d-9
4 e-10-f-1-3.xl
5 e-10-f-2-7.s
dtype: object
有 6 行和三种字符串格式/模板(已知)。目标是根据字符串为每一行提取一个数字。这是我想出的:
s.str.extract('a-b-([0-9])|c1-d-([0-9])|e-10-f-[0-9]-([0-9])')
这正确地从每一行中提取了我想要的数字:
0 1 2
0 1 NaN NaN
1 2 NaN NaN
2 NaN 5 NaN
3 NaN 9 NaN
4 NaN NaN 3
5 NaN NaN 7
但是,由于我在正则表达式中有三个组,所以我有 3 列,问题来了:
我可以编写一个具有一组或可以生成单个列的正则表达式,还是需要将这些列合并为一个列,如果需要,我如何在没有循环的情况下做到这一点?
期望的结果将是一个系列,如:
0 1
1 2
2 5
3 9
4 3
5 7
解决方案
最简单的做法是bfill\ffill
:
(s.str.extract('a-b-([0-9])|c1-d-([0-9])|e-10-f-[0-9]-([0-9])')
.bfill(axis=1)
[0]
)
输出:
0 1
1 2
2 5
3 9
4 3
5 7
Name: 0, dtype: object
另一种方法是使用可选的非捕获组:
s.str.extract('(?:a-b-)?(?:c1-d-)?(?:e-10-f-[0-9]-)?([0-9])')
输出:
0
0 1
1 2
2 5
3 9
4 3
5 7
推荐阅读
- 3d - Anylogic中的GIS地图3D动画
- javascript - React 类组件属性中的 TypeScript 错误在类型“Readonly<{}>”上不存在,不确定如何设置状态类型
- python - Python:计算不同输入价格的增值税金额
- python-3.x - 如何正确解码带有混合八进制转义的 utf-8 字符串?
- github - 从 VS 代码连接到 Github 失败
- mongodb - 如何在 MongoDB Golang 中将值对象更新为数组?
- javascript - 从按钮加载 React 组件单击 Extjs
- python - 在 python 中打印 10^15 大小的字符串
- typescript - 如何在 react-navigation 库中键入导航?
- uml - 在PlantUML序列图中放置actor的消息文本