2017-04-20 64 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