Python 将复杂str更改为在数据帧中浮动

Python 将复杂str更改为在数据帧中浮动,python,regex,string,pandas,dataframe,Python,Regex,String,Pandas,Dataframe,我有一个数据集,其中包含一列关于公司资历的数据,格式为:“9年9个月14天”,格式为str格式。我通过将它们转换为float,以便使用正则表达式循环: for row in range(len(df)): target = df['seniority'][row] content = re.findall(r'\d+', target) content[0] = float(content[0]) content[1] = (float(content[1]))/

我有一个数据集,其中包含一列关于公司资历的数据,格式为:
“9年9个月14天”
,格式为
str
格式。我通过
将它们转换为
float
,以便使用正则表达式循环:

for row in range(len(df)):
    target = df['seniority'][row]
    content = re.findall(r'\d+', target)
    content[0] = float(content[0])
    content[1] = (float(content[1]))/12
    content[2] = ((float(content[2]))/30)/12
    content = sum(content)
    df['seniority'][row] = content
它起作用了。 但我对更有效、更快捷的方法感兴趣,如果它存在的话。

设置

df = pd.DataFrame(
    {'sen': ['9 years 9 months 14 days', '2 years 4 months 12 days']
})
df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1, 12, 365]).sum(1)

0    9.788356
1    2.366210
dtype: float64
df = pd.concat([df]*10000).reset_index(drop=True)

%%timeit                                                  
for row in range(len(df)):                                
    target = df['sen'][row]                               
    content = re.findall(r'\d+', target)                  
    content[0] = float(content[0])                        
    content[1] = (float(content[1]))/12                   
    content[2] = ((float(content[2]))/30)/12              
    content = sum(content)
242 ms ± 1.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit                                                  
df['seniority'] = [                                   
    sum((float(x), float(y)/12, float(z)/365))        
    for x, y, z in df.sen.str.findall(r'(\d+)').values
]
29.9 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1,12, 365]).sum(1)
29 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
选项1
用str.findall列出理解力

df['seniority'] = [
    sum((float(x), float(y)/12, float(z)/365))
    for x, y, z in df.sen.str.findall(r'(\d+)').values
]

# Result

                        sen  seniority
0  9 years 9 months 14 days   9.788356
1  2 years 4 months 12 days   2.366210
选项2
str.extract
使用
div
sum

df = pd.DataFrame(
    {'sen': ['9 years 9 months 14 days', '2 years 4 months 12 days']
})
df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1, 12, 365]).sum(1)

0    9.788356
1    2.366210
dtype: float64
df = pd.concat([df]*10000).reset_index(drop=True)

%%timeit                                                  
for row in range(len(df)):                                
    target = df['sen'][row]                               
    content = re.findall(r'\d+', target)                  
    content[0] = float(content[0])                        
    content[1] = (float(content[1]))/12                   
    content[2] = ((float(content[2]))/30)/12              
    content = sum(content)
242 ms ± 1.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit                                                  
df['seniority'] = [                                   
    sum((float(x), float(y)/12, float(z)/365))        
    for x, y, z in df.sen.str.findall(r'(\d+)').values
]
29.9 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1,12, 365]).sum(1)
29 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
计时

df = pd.DataFrame(
    {'sen': ['9 years 9 months 14 days', '2 years 4 months 12 days']
})
df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1, 12, 365]).sum(1)

0    9.788356
1    2.366210
dtype: float64
df = pd.concat([df]*10000).reset_index(drop=True)

%%timeit                                                  
for row in range(len(df)):                                
    target = df['sen'][row]                               
    content = re.findall(r'\d+', target)                  
    content[0] = float(content[0])                        
    content[1] = (float(content[1]))/12                   
    content[2] = ((float(content[2]))/30)/12              
    content = sum(content)
242 ms ± 1.67 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit                                                  
df['seniority'] = [                                   
    sum((float(x), float(y)/12, float(z)/365))        
    for x, y, z in df.sen.str.findall(r'(\d+)').values
]
29.9 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit df.sen.str.extract(r'.*?(\d+).*?(\d+).*?(\d+)').astype(float).div([1,12, 365]).sum(1)
29 ms ± 143 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

总是这样吗?你想要几年后的最终浮动?是的,是的。谢谢你的回答!