2017-04-20 65 views
1

我有这样一个数据帧:熊猫GROUPBY()变换()MAX()与过滤

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 

但我想从today()添加名为'max_12_months'另一列的'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 

感谢任何帮助!

回答

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 
+0

这是完美的谢谢! :d – Kvothe