使用 Pandas 中的 groupby()、transform() 和 max() 进行筛选。

5

I have a dataframe like this:

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 

我希望为每个唯一的'id'值创建一个名为'max_ever'的列。

我可以这样做: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',对于每个唯一的'id'值,从today()开始计算。

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

最终的数据框应如下所示:

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个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接