pandas 在Python中从字符串中提取多个数字

fnvucqvd  于 2023-01-07  发布在  Python
关注(0)|答案(2)|浏览(197)

我在Excel中有以下数据

Work_Experience
6 Year(s) 1 Month(s)
12 Year(s) 11 Month(s)
10 Year(s) 10 Month(s)
10 Year(s) 2 Month(s)
2 Year(s) 12 Month(s)

现在,我希望Python中应该有两个额外的列作为输出生成,其中B列中包含年数(数字),C列中包含月数(数字),如下所示的输出

Work_Experience       Year  Month
6 Year(s) 1 Month(s)     6      1
12 Year(s) 11 Month(s)  12     11
10 Year(s) 10 Month(s)  10     10
10 Year(s) 2 Month(s)   10      2
2 Year(s) 12 Month(s)    2     12

我尝试了下面的代码

Test[['Year','Month']] = Test['Work_Experience'].str.extract(\(\d+)(\d+))

它显示语法错误:行继续符后出现意外字符

siotufzp

siotufzp1#

您可以使用str.extract

df[['Year', 'Month']] = (df['Work_Experience']
                         .str.extract('(\d+)\s*Year.*?(\d+)\s*Month')
                         .astype(int)
                         )

输出:

Work_Experience Year Month
0    6 Year(s) 1 Month(s)    6     1
1  12 Year(s) 11 Month(s)   12    11
2  10 Year(s) 10 Month(s)   10    10
3   10 Year(s) 2 Month(s)   10     2
4   2 Year(s) 12 Month(s)    2    12
备选方案

如果您需要一种替代方法,以任意顺序提取名称并自动将下一个单词指定为列名:

df = df.join(df['Work_Experience']
 .str.extractall('(\d+)\s*(\w+)')
 .droplevel(1)
 .pivot(columns=1, values=0).astype(int)
)
y0u0uwnf

y0u0uwnf2#

您的模式\(\d+)(\d+)以匹配\(\d+)中的文字括号\(开始,但其后有一个含义不同的未闭合(未转义)括号。数字之间也有字符不匹配。

    • 注意**在使用str.extract时,必须将正则表达式放在引号之间

如果要组合匹配括号和数字分组:

\b(\d+)\s+Year\(s\)\s+(\d+)\s+Month\(s\)
    • 说明**
  • \b字边界
  • (\d+)在第1组中捕获1+个数字
  • \s+Year\(s\)\s+在1+个空白字符之间匹配Year(s)
  • (\d+)捕获第2组中的1+个数字
  • \s+Month\(s\) Match 1+ whitspace chars and个月'

参见regex101 demo

Test[['Year', 'Month']] = Test['Work_Experience'].str.extract(r'\b(\d+)\s+Year\(s\)\s+(\d+)\s+Month\(s\)')
print(Test)

产出

Work_Experience Year Month
0    6 Year(s) 1 Month(s)    6     1
1  12 Year(s) 11 Month(s)   12    11
2  10 Year(s) 10 Month(s)   10    10
3   10 Year(s) 2 Month(s)   10     2
4   2 Year(s) 12 Month(s)    2    12

相关问题