Выберите два слова периода времени из строки в столбце Панды и преобразуйте в количество дней

#python #pandas

Вопрос:

 df.column_1:
had 2 months of ownership
had 1 week of ownership
had 2 years of ownership
 

Я хочу преобразовать время владения в дату df.column_1 . Ожидаемый результат составляет:

 df.column_1:
60
7
730
 

Ниже приведено то, что у меня есть до сих пор:

 df['column_1'] = df['column_1'].str.split(r'D').str.get(1)
 

Но это дает только вторую строку (например, 2, 1, 2). Я планировал получить вторую и третью строки (например, 2 месяца) и преобразовать их в дату.

Ответ №1:

Вы можете использовать str.extract() для извлечения текста числа и периода (день/неделя/месяц/год). Затем замените текст периода знаком умножения * , за которым следует соответствующее количество дней, чтобы составить формулу (например 2 *30 , за 2 месяца). Затем используйте pd.eval для оценки значений формулы:

 df['result'] = (df['column_1'].str.extract(r'(d s*w )')[0]
                              .replace({r'days?': '*1', 
                                        r'weeks?': '*7', 
                                        r'fortnights?': '*14', 
                                        r'months?': '*30',  
                                        r'years?': '*365'}, regex=True)
                              .apply(pd.eval)
               )
 

Результат:

 print(df)

                    column_1  result
0  had 2 months of ownership      60
1    had 1 week of ownership       7
2   had 2 years of ownership     730
 

Комментарии:

1. Очень хорошее решение, даже работает со строками с отклонениями от шаблона.

Ответ №2:

Предполагая, что строки в column_1 следуют одному и тому же шаблону, вы можете подготовить словарь для терминов периода времени.

Подготовка фрейма данных

 import pandas as pd

t="""had 2 months of ownership
had 1 week of ownership
had 2 years of ownership"""
df = pd.DataFrame(t.split('n'), columns=['c1'])
df
 

Выход

                           c1
0  had 2 months of ownership
1    had 1 week of ownership
2   had 2 years of ownership
 

Чтобы облегчить удаление s из строк.

 d = { 'day': 1, 'week': 7, 'month': 30, 'year': 365}
df['c1_in_days'] = df.c1.str.split().apply(lambda x: int(x[1])*d[x[2].replace('s','')])
df
 

Выход

                           c1  c1_in_days
0  had 2 months of ownership          60
1    had 1 week of ownership           7
2   had 2 years of ownership         730