In Python habe ich einen Pandas-DataFrame, der dem folgenden ähnelt:
Item | shop1 | shop2 | shop3 | Category
------------------------------------
Shoes| 45 | 50 | 53 | Clothes
TV | 200 | 300 | 250 | Technology
Book | 20 | 17 | 21 | Books
phone| 300 | 350 | 400 | Technology
Wo shop1, shop2 und shop3 die Kosten für jeden Artikel in verschiedenen Shops sind ... Nun muss ich nach einigen Datenbereinigungen einen DataFrame zurücksenden, z.
Category (index)| size| sum| mean | std
----------------------------------------
dabei ist size die Anzahl der Elemente in jeder Kategorie und Summe, Mittelwert und Standardwert beziehen sich auf die gleichen Funktionen, die auf die drei Shops angewendet werden. Wie kann ich diese Operationen mit dem Split-Apply-Combine-Muster (Gruppieren, Aggregieren, Anwenden, ...) ausführen?
Kann mir jemand helfen? Ich werde verrückt mit diesem ... danke!
Bearbeitet für Pandas 0.22+ in Anbetracht der Abwertung der Verwendung von Wörterbüchern in einer Gruppe durch Aggregation.
Wir haben ein sehr ähnliches Wörterbuch eingerichtet, in dem wir mithilfe der Tasten des Wörterbuchs unsere Funktionen angeben und das Wörterbuch selbst, um die Spalten umzubenennen.
rnm_cols = dict(size='Size', sum='Sum', mean='Mean', std='Std')
df.set_index(['Category', 'Item']).stack().groupby('Category') \
.agg(rnm_cols.keys()).rename(columns=rnm_cols)
Size Sum Mean Std
Category
Books 3 58 19.333333 2.081666
Clothes 3 148 49.333333 4.041452
Technology 6 1800 300.000000 70.710678
Option 1
Verwenden Sie agg
← Link zu docs
agg_funcs = dict(Size='size', Sum='sum', Mean='mean', Std='std')
df.set_index(['Category', 'Item']).stack().groupby(level=0).agg(agg_funcs)
Std Sum Mean Size
Category
Books 2.081666 58 19.333333 3
Clothes 4.041452 148 49.333333 3
Technology 70.710678 1800 300.000000 6
Option 2
mehr für weniger
Verwenden Sie describe
← Link zu docs
df.set_index(['Category', 'Item']).stack().groupby(level=0).describe().unstack()
count mean std min 25% 50% 75% max
Category
Books 3.0 19.333333 2.081666 17.0 18.5 20.0 20.5 21.0
Clothes 3.0 49.333333 4.041452 45.0 47.5 50.0 51.5 53.0
Technology 6.0 300.000000 70.710678 200.0 262.5 300.0 337.5 400.0
df.groupby('Category').agg({'Item':'size','shop1':['sum','mean','std'],'shop2':['sum','mean','std'],'shop3':['sum','mean','std']})
Oder wenn Sie es in allen Geschäften wünschen, dann:
df1 = df.set_index(['Item','Category']).stack().reset_index().rename(columns={'level_2':'Shops',0:'costs'})
df1.groupby('Category').agg({'Item':'size','costs':['sum','mean','std']})
Wenn ich es richtig verstanden habe, möchten Sie die aggregierten Metriken für alle Shops berechnen, nicht für jeden einzelnen. Um dies zu tun, können Sie zunächst stack
Ihren Datenrahmen und dann nach Category
gruppieren:
stacked = df.set_index(['Item', 'Category']).stack().reset_index()
stacked.columns = ['Item', 'Category', 'Shop', 'Price']
stacked.groupby('Category').agg({'Price':['count','sum','mean','std']})
Was in ... resultiert
Price
count sum mean std
Category
Books 3 58 19.333333 2.081666
Clothes 3 148 49.333333 4.041452
Technology 6 1800 300.000000 70.710678