我有一个这样的数据框:
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
我希望为每个唯一值'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
但我想为'max_12_months'
的每个唯一值today()
添加另一个名为'id'
的列。{/ 1>
我可以使用过滤日期创建新的数据框并重复上述内容,但我想在此数据框中尝试过滤和转换。
最终的数据框如下所示:
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
感谢任何帮助!
答案 0 :(得分:1)
自定义agg
功能为apply
'd ...然后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