#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