groupby, подсчитать прошлые события и показать самое последнее событие - PullRequest
0 голосов
/ 13 июля 2020

Как я могу сгруппировать по уникальному идентификатору и подсчитать количество прошлых просрочек («Плохо») и прошлых просрочек («Хорошо») перед самым последним событием.

Например, учитывая следующее dataframe:

ID    Date         Class    
112   2018-02-12    Good
112   2019-01-20    Bad
113   2018-10-11    Bad
113   2019-01-01    Good
113   2020-02-03    Good

Это должна быть конечная цель:

ID    Past_deliq  Past_non_deliq  Class   Date
112      0           1             Bad    2019-01-20
113      1           1             Good   2020-02-03

Я могу получить самое последнее событие, выполнив следующие действия, df.loc[df.groupby('ID').Date.idxmax()], но я не могу найти способ подсчитать прошлые случаи.

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 13 июля 2020
b=df.groupby(["ID","Class"])["Class"].count().unstack()

Вы группируетесь как по идентификатору, так и по классу, что означает, что вы получите количество каждого класса для каждого идентификатора. Затем вы вызываете unstack, который берет самые левые метки из индекса и вставляет их как столбцы.

После того, как вы создадите другую группу, по которой вы определяете последнее появление (это решение предполагает, что ваши данные упорядочены по дате, если не использовать функцию max).

c=df.groupby("ID").agg({"Date":"last","Class":"last"})

После объединения двух фреймов данных.

b.merge(c, on="ID")

И вы получите то, что просили.

1 голос
/ 13 июля 2020

Просто немного c изменение формы и crosstab.

Идея состоит в том, чтобы отфильтровать фрейм данных по значениям, которые не являются максимальными, выполнить агрегацию подсчета значений и повторно присоединить фрейм данных к макс. даты.

max_date = df.groupby('ID')['Date'].max()
s1 = df.loc[~df.index.isin(df.groupby("ID")["Date"].idxmax())]

df1 = pd.crosstab(s1.ID, s1.Class).join(max_date).rename(
    columns={"Bad": "Past_deliq", "Good": "Past_non_deliq"}
)



     Past_deliq  Past_non_deliq       Date
ID                                        
112           0               1 2019-01-20
113           1               1 2020-02-03
...