根据每组过去的记录找到cumcount和agg func

Find cumcount and agg func based on past records of each group

我有一个如下所示的数据框

df = pd.DataFrame(
    {'stud_name' : ['ABC', 'ABC','ABC','DEF', 
                  'DEF','DEF'],
     'qty' : [123,31,490,518,70,900],
     'trans_date' : ['13/11/2020','10/1/2018','11/11/2017','27/03/2016','13/05/2010','14/07/2008']})

我想执行以下操作

a) 对于每个 stud_name,查看他们过去的数据(完整的过去数据)并计算 qtyminmaxmean ] 列

请注意,每个唯一 stud_name 的第一个 record/row 将是 NA,因为没有过去的数据(历史)可以查看和计算汇总统计数据

我尝试了类似下面的操作,但输出不正确

df['trans_date'] = pd.to_datetime(df['trans_date'])
df.sort_values(by=['stud_name','trans_date'],inplace=True)
df['past_transactions'] = df.groupby('stud_name').cumcount()
df['past_max_qty'] = df.groupby('stud_name')['qty'].expanding().max().values
df['past_min_qty'] = df.groupby('stud_name')['qty'].expanding().min().values
df['past_avg_qty'] = df.groupby('stud_name')['qty'].expanding().mean().values

我希望我的输出如下所示

我们可以使用自定义函数来计算每个学生的过去统计数据

def past_stats(q):
    return (
        q.expanding()
        .agg(['max', 'min', 'mean'])
        .shift().add_prefix('past_')
    )

df.join(df.groupby('stud_name')['qty'].apply(past_stats))

  stud_name  qty trans_date  past_max  past_min  past_mean
2       ABC  490 2017-11-11       NaN       NaN        NaN
1       ABC   31 2018-10-01     490.0     490.0      490.0
0       ABC  123 2020-11-13     490.0      31.0      260.5
5       DEF  900 2008-07-14       NaN       NaN        NaN
4       DEF   70 2010-05-13     900.0     900.0      900.0
3       DEF  518 2016-03-27     900.0      70.0      485.0