Variationen dieser Frage wurden gestellt (siehe this question), aber ich habe keine gute Lösung gefunden für einen gemeinsamen Anwendungsfall von groupby
in Pandas scheinen.Wenden Sie mehrere Funktionen gleichzeitig auf Pandas groupby Objekt
sagen, dass ich die Datenrahmen lasts
und I-Gruppe haben von user
:
lasts = pd.DataFrame({'user':['a','s','d','d'],
'elapsed_time':[40000,50000,60000,90000],
'running_time':[30000,20000,30000,15000],
'num_cores':[7,8,9,4]})
Und ich habe diese Funktionen ich groupby_obj
anwenden möchten (was die Funktionen tun, ist nicht wichtig, und ich machte sie auf, nur wissen, dass sie mehrere Spalten aus dem Datenrahmen) erfordern:
def custom_func(group):
return group.running_time.median() - group.num_cores.mean()
def custom_func2(group):
return max(group.elapsed_time) -min(group.running_time)
ich konnte apply
jede dieser Funktionen separat an den Datenrahmen und dann verschmelzen den daraus resultierenden Datenrahmen, aber das scheint ineffizient, ist unelegant, und ich stelle mir vor, es muss eine One-Line-Lösung sein.
Ich habe nicht wirklich eine gefunden, obwohl diese blog post (Suche nach "Erstellen Sie eine Funktion, um die Statistiken einer Gruppe" auf der Unterseite der Seite) schlug die Funktionen in eine Funktion als ein Wörterbuch soly:
def get_stats(group):
return {'custom_column_1': custom_func(group), 'custom_column_2':custom_func2(group)}
Allerdings, wenn ich den Code groupby_obj.apply(get_stats)
, statt Spalten laufen bekomme ich eine Spalte Wörterbuch Ergebnisse:
user
a {'custom_column_1': 29993.0, 'custom_column_2'...
d {'custom_column_1': 22493.5, 'custom_column_2'...
s {'custom_column_1': 19992.0, 'custom_column_2'...
dtype: object
wenn in der Realität würde ich mag verwenden eine Codezeile, um etwas näher an diesen Datenrahmen zu bringen:
user custom_column_1 custom_column_2
a 29993.0 10000
d 22493.5 75000
s 19992.0 30000
Vorschläge zur Verbesserung dieses Workflows?
IMHO Wrapping das Wörterbuch in einer Serie ist die beste Lösung für diese Frage der drei, die Sie vorgestellt haben. Vielen Dank. –
@ zthomas.nc, Sie sind willkommen :) Bitte beachten Sie [akzeptieren] (http://meta.stackexchange.com/a/5235) eine Antwort, wenn Sie denken, dass es Ihre Frage beantwortet hat – MaxU
Stimmen Sie mit @ zthomas.nc Und ja Vergiss nicht zu akzeptieren .... – piRSquared