python - 如何在熊猫的数据框中使用正则表达式提取部分文本
问题描述
我有一个数据框,其中一列是这样的:
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
...first row
但2
我不确定如何获得years
days
ormonth
所以我可以将所有值更改为天数。
显然,我需要能够找到之后的第一个数字,space
但我不知道我该怎么做这部分。
解决方案
我们试试看:
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)
输出:
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
推荐阅读
- node.js - 提交表单后打开一个新的模态 Slack Bot
- python - 为什么 heapq 使用列表的最前面?
- c# - Unity动画设置bool true但设置true后不设置false?
- java - Java 依赖项无法找到自己的资源 - 在 AWS Lambda 中运行的代码
- excel - 不同文件中的相同公式不同值-小数四舍五入问题
- android - gson.fromJson 预期 BEGIN_OBJECT 但由于对象的存储方式而为 BEGIN_ARRAY
- docker - 如果docker上的cuda版本与PC上的cuda版本不同,这有关系吗?
- python - 如何从 ls 命令创建文件列表?
- python - FileInput中的Django“未选择文件”
- python - 将线图添加到 Facetgrid 图