it-swarm.com.de

Python-Pandas werden nach mehreren Spalten zusammengefasst und dann gedreht

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!

15

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
16
piRSquared
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']})
7
Scott Boston

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