Python 熊猫可选提取物

Python 熊猫可选提取物,python,pandas,dataframe,Python,Pandas,Dataframe,我在数据集中有一列,其格式如下: 'XX4H30M' 我需要将这些序列中的数字提取到两列(“H”和“M”) 如果格式与所述完全相同,则以下内容满足我的需要: d3 = df.colname.str.extract('([0-9])([0-9])', expand=True) d3.columns = ['H', 'M'] df = pd.concat([df, d3]) 然而,在这个系列中,很多单元格只包含 'XX45M' 或XX3H 是否有一种方法可以选择性地提取这些模式以将其插入全局d

我在数据集中有一列,其格式如下:

'XX4H30M'
我需要将这些序列中的数字提取到两列(“H”和“M”)

如果格式与所述完全相同,则以下内容满足我的需要:

d3 = df.colname.str.extract('([0-9])([0-9])', expand=True)
d3.columns = ['H', 'M']
df = pd.concat([df, d3])
然而,在这个系列中,很多单元格只包含

'XX45M'
XX3H

是否有一种方法可以选择性地提取这些模式以将其插入全局df

对于一组具体的示例:

df = pd.DataFrame({'A': ['XX1H30M', 'XX45M', 'XX2H'])
最终将成为

Out: 
A  H  M
0  XX1H30M  1  30
1  XX45M  0  45
2  XX2H  2  0

您可以尝试以下方法:

df.assign(H=df.A.str.extract('([\d]+)H', expand=False),
          M=df.A.str.extract('([\d]+)M', expand=False)).fillna(0)
输出:

         A  H   M
0  XX1H30M  1  30
1    XX45M  0  45
2     XX2H  2   0

您可以尝试以下方法:

df.assign(H=df.A.str.extract('([\d]+)H', expand=False),
          M=df.A.str.extract('([\d]+)M', expand=False)).fillna(0)
输出:

         A  H   M
0  XX1H30M  1  30
1    XX45M  0  45
2     XX2H  2   0

在一个步骤中提取
H
M
的另一个选项,这里使用
(?:(?p\d+H)?(?:(?p\d+M)?
捕获
H
M
作为命名组;为了避免由于两个组都是可选的而匹配空字符串,请在模式开头添加一个先行断言
(?=\d+H |\d+M)

df = pd.DataFrame({'A': ['XXX1H30M', 'XXX45M', 'XXX2H', 'XXX']}) 

df.A.str.extract(r'(?=\d+H|\d+M)(?:(?P<H>\d+)H)?(?:(?P<M>\d+)M)?', expand=True).fillna(0)

#   H    M
#0  1   30
#1  0   45
#2  2    0
#3  0    0
df=pd.DataFrame({'A':['XXX1H30M','XXX45M','XXX2H','XXX']})
df.A.str.extract(r'(?=\d+H |\d+M)(?:(?P\d+H)?(?:(?P\d+M)?),expand=True)。fillna(0)
#嗯
#0  1   30
#1  0   45
#2  2    0
#3  0    0
这比单独提取快一点:

df = pd.concat([df] * 10000)

%timeit pd.concat([df, df.A.str.extract(r'(?=\d+H|\d+M)(?:(?P<H>\d+)H)?(?:(?P<M>\d+)M)?', expand=False).fillna(0)], axis=1)
#10 loops, best of 3: 83.9 ms per loop    

%timeit df.assign(H=df.A.str.extract('([\d]+)H', expand=False), M=df.A.str.extract('([\d]+)M', expand=False)).fillna(0)
#10 loops, best of 3: 130 ms per loop
df=pd.concat([df]*10000)
%timeit pd.concat([df,df.A.str.extract(r'(?=\d+H |\d+M)(?:(?P\d+H)?(?:(?P\d+M)?,expand=False)。fillna(0)],轴=1)
#10个回路,最佳3个:每个回路83.9毫秒
%timeit df.assign(H=df.A.str.extract('([\d]+)H',expand=False),M=df.A.str.extract('([\d]+)M',expand=False)).fillna(0)
#10个回路,最好为3:130 ms/回路

在一个步骤中提取
H
M
的另一个选项,这里使用
(?:(?p\d+)H)?(?:(?p\d+)M)?
捕获
H
M
作为命名组;为了避免由于两个组都是可选的而匹配空字符串,请在模式开头添加一个先行断言
(?=\d+H |\d+M)

df = pd.DataFrame({'A': ['XXX1H30M', 'XXX45M', 'XXX2H', 'XXX']}) 

df.A.str.extract(r'(?=\d+H|\d+M)(?:(?P<H>\d+)H)?(?:(?P<M>\d+)M)?', expand=True).fillna(0)

#   H    M
#0  1   30
#1  0   45
#2  2    0
#3  0    0
df=pd.DataFrame({'A':['XXX1H30M','XXX45M','XXX2H','XXX']})
df.A.str.extract(r'(?=\d+H |\d+M)(?:(?P\d+H)?(?:(?P\d+M)?),expand=True)。fillna(0)
#嗯
#0  1   30
#1  0   45
#2  2    0
#3  0    0
这比单独提取快一点:

df = pd.concat([df] * 10000)

%timeit pd.concat([df, df.A.str.extract(r'(?=\d+H|\d+M)(?:(?P<H>\d+)H)?(?:(?P<M>\d+)M)?', expand=False).fillna(0)], axis=1)
#10 loops, best of 3: 83.9 ms per loop    

%timeit df.assign(H=df.A.str.extract('([\d]+)H', expand=False), M=df.A.str.extract('([\d]+)M', expand=False)).fillna(0)
#10 loops, best of 3: 130 ms per loop
df=pd.concat([df]*10000)
%timeit pd.concat([df,df.A.str.extract(r'(?=\d+H |\d+M)(?:(?P\d+H)?(?:(?P\d+M)?,expand=False)。fillna(0)],轴=1)
#10个回路,最佳3个:每个回路83.9毫秒
%timeit df.assign(H=df.A.str.extract('([\d]+)H',expand=False),M=df.A.str.extract('([\d]+)M',expand=False)).fillna(0)
#10个回路,最好为3:130 ms/回路