Вы можете попробовать это:
df.sort_values('AccountRatingDate')\
.query('AccountRating == "Delayed"')\
.groupby('Debtor ID')[['AccountRating','AmountOutstanding','AmountPastDue']]\
.agg({'AccountRating':'count',
'AmountOutstanding':'last',
'AmountPastDue':'last'})\
.reindex(df['Debtor ID'].unique(), fill_value=0)\
.reset_index()
Вывод:
Debtor ID AccountRating AmountOutstanding AmountPastDue
0 John Snow 2 6000 300
1 Sarah Parker 0 0 0
2 Edward Hall 0 0 0
3 Douglas Core 2 1000 400
Подробности:
- Первая сортировка фрейма данных по AccountRatingDate, чтобы получить последнюю дату какпоследняя запись.
- Отфильтруйте данные только для тех, чьи AccountRatings равны 'Delayed'
- Идентификатор должника Groupby со столбцами для агрегирования, затем используйте agg со словарем, чтобы указать, как агрегировать каждый столбец
- Переиндексировать с уникальными значениями идентификатора должника, чтобы заполнить ноль для тех, без каких-либо задержек
- И, сбросить индекс.
И вы можете сделать переименование столбца с помощьюrename
и словарь:
df.sort_values('AccountRatingDate')\
.query('AccountRating == "Delayed"')\
.groupby('Debtor ID')[['AccountRating','AmountOutstanding','AmountPastDue']]\
.agg({'AccountRating':'count',
'AmountOutstanding':'last',
'AmountPastDue':'last'})\
.reindex(df['Debtor ID'].unique(), fill_value=0)\
.rename(columns={'AccoutRating':'Incidents of delay',
'AmountOutstanding':'TheMostRecentOutstanding',
'AmountPastDue':'TheMostRecentPastDue'})\
.reset_index()
Вывод:
Debtor ID AccountRating TheMostRecentOutstanding TheMostRecentPastDue
0 John Snow 2 6000 300
1 Sarah Parker 0 0 0
2 Edward Hall 0 0 0
3 Douglas Core 2 1000 400