groupby,统计过去发生的事件,并显示最近的事件



如何根据唯一标识符进行分组,并统计最近事件之前的过去拖欠次数("Bad"(和过去未拖欠次数(‘Good’(。

例如,给定以下数据帧:

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()],但我找不到计算过去事件的方法。

非常感谢您的帮助。

只是一些基本的重塑和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
b=df.groupby(["ID","Class"])["Class"].count().unstack()

您通过ID和Class进行分组,这意味着您将获得每个ID的每个类的计数。然后调用unstack,它从索引中获取最左边的标签,并将它们作为列插入。

在您创建另一个组之后,您可以根据该组来确定最后一次出现(此解决方案假设您的数据是按日期排序的,如果不使用函数max(。

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

合并两个数据帧后。

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

你得到了你所要求的。

最新更新