【问题标题】:groupby, count past occurences of events, and show the most recent eventgroupby,统计过去发生的事件,并显示最近的事件
【发布时间】:2020-11-02 17:09:40
【问题描述】:

我如何按唯一标识符进行分组,并计算最近事件之前的过去拖欠('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()],但我找不到计算过去事件的方法。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:

    只是一些基本的重塑和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
    

    【讨论】:

      【解决方案2】:
      b=df.groupby(["ID","Class"])["Class"].count().unstack()
      

      您按 ID 和类别分组,这意味着您将获得每个 ID 的每个类别的计数。比你调用 unstack 从索引中获取最左边的标签并将它们作为列插入。

      在您确定最后一次出现的另一个 groupby 之后(此解决方案假设您的数据按日期排序,如果不使用函数 max)。

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

      合并两个数据框后。

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

      你得到了你所要求的。

      【讨论】:

        猜你喜欢
        • 2020-08-27
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多