Python 如何在pandas中的数据帧上使用正则表达式提取部分文本
我有一个数据框,其中一列如下:Python 如何在pandas中的数据帧上使用正则表达式提取部分文本,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,我有一个数据框,其中一列如下: df = index dosage_duration 0 5 years20mg 1X D 1 2 days10mg 1X D 2 2 days10mg 1X D 3 7 weeks 4 2 months 5 3 days 6
df = index dosage_duration
0 5 years20mg 1X D
1 2 days10mg 1X D
2 2 days10mg 1X D
3 7 weeks
4 2 months
5 3 days
6 1 years5 MG
7 2 years
df = index dosage_duration new_dosage
0 5 years20mg 1X D 5*365
1 2 days10mg 1X D 2
2 2 days10mg 1X D 2
3 7 weeks 7*7
4 2 months 2*30
5 3 days 3
6 1 years5 MG 1*365
7 2 years 2*365
我试图做的是提取时间的第一部分,并将其转换为天。
因此,结果如下所示:
df = index dosage_duration
0 5 years20mg 1X D
1 2 days10mg 1X D
2 2 days10mg 1X D
3 7 weeks
4 2 months
5 3 days
6 1 years5 MG
7 2 years
df = index dosage_duration new_dosage
0 5 years20mg 1X D 5*365
1 2 days10mg 1X D 2
2 2 days10mg 1X D 2
3 7 weeks 7*7
4 2 months 2*30
5 3 days 3
6 1 years5 MG 1*365
7 2 years 2*365
正如你在这里看到的,5年被转换成5*365天
我能够得到第一部分,让我们在第一行中说5
,在第二行中说2
。。。但我不确定如何获得年
天
或月
以便将所有值更改为天刻度
显然,我需要能够找到空格后的第一个数字,但我不知道如何才能找到这部分。
- 按空间分割
- 第一个元素是你的数字
- 第二个元素表示现在是什么时间<代码>日
,周
,月
,年
。只要第一个字母就足以确定要乘什么
将熊猫作为pd导入
df=pd.数据框({'Doscent_duration':['5年27ABC','10天92PQR','5.5周782364HGSDF','3个月21647HADJH']))
mul={
"d":1,,
“w”:7,
“m”:30岁,
y:365
}
df[‘新剂量’]=df[‘剂量持续时间’]。应用(lambda x:x.split())。应用(lambda x:float(x[0])*mul[x[1][0])
df
输出:
dosage_duration new_dosage
0 5 years27abc 1825
1 10 days92pqr 10
2 5.5 weeks782364hgsdf 35
3 3 months21647hadjh 90
t total_time
0 5 years27abc 5*365
1 10 days92pqr 10*1
2 5 weeks782364hgsdf 5*7
3 3 months21647hadjh 3*30
dosage_duration new_duration
0 5 years20mg 1x D 1825
1 2 days10mg 1x D 2
2 4 months20mg 1x D 120
3 7 weeks 49
4 2 months 60
5 3 days 3
6 1 days 1
7 1 years5 MG 365
8 2 years 730
9 6 months 180
10 1 years10 1x D 365
11 10 months15 300
更新:
- 如果希望它们作为表达式字符串
将熊猫作为pd导入
df=pd.DataFrame({'t':['5 years27abc','10 days92pqr','5周782364hgsdf','3个月21647hadjh']))
mul={
‘d’:‘1’,
‘w’:‘7’,
‘m’:‘30’,
“y”:“365”
}
df['total_time']=df['t'].apply(lambda x:x.split()).apply(lambda x:x[0]+'*'+mul[x[1][0]]
df
输出:
dosage_duration new_dosage
0 5 years27abc 1825
1 10 days92pqr 10
2 5.5 weeks782364hgsdf 35
3 3 months21647hadjh 90
t total_time
0 5 years27abc 5*365
1 10 days92pqr 10*1
2 5 weeks782364hgsdf 5*7
3 3 months21647hadjh 3*30
dosage_duration new_duration
0 5 years20mg 1x D 1825
1 2 days10mg 1x D 2
2 4 months20mg 1x D 120
3 7 weeks 49
4 2 months 60
5 3 days 3
6 1 days 1
7 1 years5 MG 365
8 2 years 730
9 6 months 180
10 1 years10 1x D 365
11 10 months15 300
让我们试试:
df = pd.DataFrame({'dosage_duration':['5 years20mg 1x D'
,'2 days10mg 1x D'
,'4 months20mg 1x D'
,'7 weeks'
,'2 months'
,'3 days'
,'1 days'
,'1 years5 MG'
,'2 years'
,'6 months'
,'1 years10 1x D'
,'10 months15']})
nmap={'years':365, 'months':30, 'weeks':7, 'days': 1}
strnmap = '|'.join(nmap.keys())
df_m = df.dosage_duration.str.extract(f'(?P<unit>\d+)\s?(?P<span>[{strnmap}]+)')
df['new_duration']= df_m['unit'].astype(int).mul(df_m['span'].map(nmap))
print(df)
不要将数据作为图像发布。它很难复制给其他人。你能提供一些代码来代替图片吗?请添加失败的代码。当然,我会添加数据帧和我尝试过的代码非常感谢@Poojan。实际上我得到了这个错误ValueError:int()的无效文本,基数为10:'1.5'
,如果我改为float
,它会引发KeyError:'t'
你可以将int改为float inlambda
是的,但它会引发KeyError:'t'
。你知道原因吗?我的熊猫数据框是样本数据框。根据需要更改此中的列名dataframe@sariii更新答案检查。