我有一个像这样的数据框:
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)
感谢任何帮助!
自定义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)