Как извлечь часть текста с помощью регулярных выражений на фрейме данных в пандах - PullRequest
0 голосов
/ 20 октября 2019

У меня есть фрейм данных, и один из столбцов выглядит так:

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 или month, чтобы я мог изменить все значения на шкалу дней.

Очевидно, мне нужно найти первый номер после space, но я не знаю, как мне выполнить эту часть.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Давайте попробуем:

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
​
1 голос
/ 20 октября 2019
  • разделить пробелом.
  • первый элемент - это ваше число.
  • Второй элемент указывает, какое это время? day, week, month, year. Достаточно только первой буквы, чтобы определить, на что умножаться.
import pandas as pd

df  = pd.DataFrame({'dosage_duration':['5 years27abc','10 days92pqr', '5.5 weeks782364hgsdf', '3 months21647hadjh']})

mul = {
    'd':1,
    'w':7,
    'm':30,
    'y':365
}

df['new_dosage'] = df['dosage_duration'].apply(lambda x:x.split()).apply(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

Обновление:

  • , если вы хотите ихкак строка выражения.
import pandas as pd

df  = pd.DataFrame({'t':['5 years27abc','10 days92pqr', '5 weeks782364hgsdf', '3 months21647hadjh']})

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

Вывод:

          t             total_time
0   5 years27abc        5*365
1   10 days92pqr        10*1
2   5 weeks782364hgsdf  5*7
3   3 months21647hadjh  3*30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...