我正在尝试从熊猫的一系列字符串中提取一个数字。例如,考虑以下系列:
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个组,所以我有3列,下面是问题:
我可以编写一个具有一组或可以生成单个列的正则表达式吗,还是需要将这些列合并为一个正则表达式?如果需要,如何在没有循环的情况下做到这一点?
所需的结果将是以下序列:
0 1
1 2
2 5
3 9
4 3
5 7
答案 0 :(得分:1)
最简单的方法是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
答案 1 :(得分:1)
您可以在最后使用一个捕获组,并在捕获组(?:
上添加3个前缀
由于它们都以连字符结尾,因此可以将其移至非捕获组之后以使其短一点。
(?:a-b|c1-d|e-10-f-[0-9])-([0-9])
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