首页 > 解决方案 > 使用带有多个组的 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

标签: pythonregexpandas

解决方案


最简单的做法是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

推荐阅读