如何根据唯一标识符进行分组,并统计最近事件之前的过去拖欠次数("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")
你得到了你所要求的。