IIUC это запутанное, но я думаю эффективное решение вашей проблемы. Обратите внимание, что в результате порядок вашего фрейма данных изменяется, а столбец Day
изменяется на d-тип временной шкалы:
Начиная с вашего фрейма данных df
:
CallID Day PersonID
0 6 2 3
1 3 14 2
2 1 8 1
3 5 1 3
4 2 12 2
5 7 100 3
Начните с изменения Day
до серии timedelta:
df['Day'] = pd.to_timedelta(df['Day'], unit='d')
Затем используйте pd.merge_asof
, чтобы объединить ваш фрейм данных с количеством вызовов каждого человека в течение 7 дней. Чтобы получить это, используйте groupby
с pd.Grouper
с периодичностью 7 дней:
new_df = (pd.merge_asof(df.sort_values(['Day']),
df.sort_values(['Day'])
.groupby([pd.Grouper(key='Day', freq='7d'), 'PersonID'])
.size()
.to_frame('ContactsIN7Days')
.reset_index(),
left_on='Day', right_on='Day',
left_by='PersonID', right_by='PersonID',
direction='nearest'))
Ваш результат new_df
будет выглядеть так:
CallID Day PersonID ContactsIN7Days
0 5 1 days 3 2
1 6 2 days 3 2
2 1 8 days 1 1
3 2 12 days 2 2
4 3 14 days 2 2
5 7 100 days 3 1