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/回路