熊猫 groupby() 变换() max() 带过滤器

Kvo*_*the 5 python pandas

我有一个像这样的数据框:

id     date       value
 1  12/01/2016      5 
 1  25/02/2016      7 
 1  10/03/2017      13 
 2  02/04/2016      0 
 2  06/07/2016      1 
 2  12/03/2017      6 
Run Code Online (Sandbox Code Playgroud)

我正在创建一个名为'max_ever'每个唯一值的列'id'

我可以:df['max_ever']=df.groupby(['id'])['value'].transform(max)

这会给我:

id     date       value  max_ever
 1  12/01/2016      5       13
 1  25/02/2016      7       13
 1  10/03/2017      13      13
 2  02/04/2016      0       6
 2  06/07/2016      1       6
 2  12/03/2017      6       6
Run Code Online (Sandbox Code Playgroud)

但我想为每个唯一值添加'max_12_months'另一today()'id'

我可以使用过滤后的日期创建一个新的数据框并重复上述操作,但我想尝试在此数据框中进行过滤和转换。

最终的数据框如下所示:

id     date       value  max_ever  max_12_months
 1  12/01/2016      13      13          7
 1  25/05/2016      7       13          7
 1  10/03/2017      5       13          7
 2  02/04/2016      6       6           2
 2  06/07/2016      1       6           2
 2  12/03/2017      2       6           2
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助!

piR*_*red 3

自定义agg函数apply...然后join

today = pd.to_datetime(pd.datetime.today()).floor('D')
year_ago = today - pd.offsets.Day(366)

def max12(df):
    return df.value.loc[df.date.between(year_ago, today)].max()

def aggf(df):
    return pd.Series(
        [df.value.max(), max12(df)],
        ['max_ever', 'max_12_months']
    )

df.join(df.groupby('id').apply(aggf), on='id')

   id       date  value  max_ever  max_12_months
0   1 2016-01-12     13        13              7
1   1 2016-05-25      7        13              7
2   1 2017-03-10      5        13              7
3   2 2016-04-02      6         6              2
4   2 2016-07-06      1         6              2
5   2 2017-03-12      2         6              2
Run Code Online (Sandbox Code Playgroud)