2017-04-20 3 views
1

Ich habe einen Datenrahmen wie folgt aus:Pandas groupby() transform() max() mit Filter

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 

Ich suche eine Spalte 'max_ever' für jeden eindeutigen Wert von 'id'

Ich rief erstellen tun können: df['max_ever']=df.groupby(['id'])['value'].transform(max)

Welche würde mir:

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 

Aber ich möchte eine andere Spalte 'max_12_months' von today()'id'

genannt hinzufügen für jeden eindeutigen Wert von I einen neuen Datenrahmen mit dem gefilterten Datum erstellen und die oben wiederholen, aber ich möchte Filter, um zu versuchen und innerhalb dieser Transformation Datenrahmen.

Der letzte Datenrahmen würde wie folgt aussehen:

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 

jede Hilfe dankbar!

Antwort

1

Benutzerdefinierte agg Funktion apply ‚d sein ... Dann 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

Dies ist Sie perfekt danken! : D – Kvothe