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 in
lambda
是的,但它会引发
KeyError:'t'
。你知道原因吗?我的熊猫数据框是样本数据框。根据需要更改此中的列名dataframe@sariii更新答案检查。