Pandas groupby()使用过滤器转换()max()

时间:2017-04-20 16:01:41

标签: 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 

我希望为每个唯一值'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

感谢任何帮助!

1 个答案:

答案 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