2017-04-02 45 views
10

, aşağıdaki benzer bir panda DataFrame var, birden çok sütun üzerinde agrega GroupBy: shop1, shop2 ve shop3 Farklı mağazalarda her öğenin maliyetlerdirPython pandalar sonra Pivot Python

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 

. Şimdi, bunun gibi bazı veriler temizledikten sonra, bir DataFrame dönmek gerekir:

boyutu, her Kategori ve toplamı öğelerin sayısı
Category (index)| size| sum| mean | std 
---------------------------------------- 

anlamına ve std uygulanan aynı fonksiyonlara ilişkin 3 dükkan. Bu işlemleri split-apply-combine pattern (groupby, aggregate, apply, ...) ile nasıl yapabilirim?

Birisi bana yardımcı olabilir mi? Ben bununla deliriyorum ... teşekkürler!

cevap

10

seçenek 1
kullanım agg ← bağlantı sonuçlanır

dokümanlara: Bunu yapmak için öncelikle stack Category ederek dataframe ve ardından grup can
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 
az
kullanım describe ← bağlantıdan

seçenek 2
daha dokümanlara

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 
2
df.groupby('Category').agg({'Item':'size','shop1':['sum','mean','std'],'shop2':['sum','mean','std'],'shop3':['sum','mean','std']}) 

Yoksa sonra tüm dükkanlar üzerinden geçirin isterseniz: Eğer doğru anlamak, değil her biri ayrı ayrı için, tüm dükkanlar için toplu ölçümleri hesaplamak isteyen

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']}) 
0

.

stacked = df.set_index(['Item', 'Category']).stack().reset_index() 
stacked.columns = ['Item', 'Category', 'Shop', 'Price'] 
stacked.groupby('Category').agg({'Price':['count','sum','mean','std']}) 

  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