#python #pandas #dataframe
#python #панды #фрейм данных
Вопрос:
У меня есть следующие два фрейма данных:
печать (df)
perid completion_date store_banner
0 15001703 2020-09-16 0
1 1000190 2020-07-21 2
...
печать (df1)
perid status substatus sample_date
0 15001703 4 3 2020-09-20
1 15024030 5 2 2020-11-05
...
Я хотел бы объединить эти два фрейма, чтобы столбцы из df1 добавлялись в df (левое слияние), если коды perid совпадают, а разница в днях между sample_date и completion_date меньше или равна 14 дням.
В псевдокоде:
- (df.perid == df1.perid) amp; ( (df1.sample_date — df.completion_date) <= 14 дней)
Таким образом, получение (в случае приведенного выше примера):
печать (final_df)
perid completion_date store_banner status substatus sample_date
0 15001703 2020-09-16 0 4 3 2020-09-20
Как я могу этого добиться?
Ответ №1:
Использование DataFrame.merge
с фильтром вычитаемых столбцов, преобразованных в дни по Series.dt.days
:
df1['completion_date'] = pd.to_datetime(df1['completion_date'])
df2['sample_date'] = pd.to_datetime(df2['sample_date'])
df = df1.merge(df2, on='perid')
df = df[(df.sample_date - df.completion_date).dt.days <= 14]
print (df)
perid completion_date store_banner status substatus sample_date
0 15001703 2020-09-16 0 4 3 2020-09-20
Комментарии:
1. Действительно, правильно; Я бы, возможно, подумал о добавлении обоих условий <= 14 amp; >= 0 . Для наглядности дата завершения относится к подписи документа и образцу для теста; следовательно, отрицательное значение будет означать, что я подпишу после выполнения теста.
2. @AlessandroCeccarelli — Затем используйте
(df.sample_date - df.completion_date).dt.days.between(0, 14)
вместо(df.sample_date - df.completion_date).dt.days <= 14