2017-04-02 35 views
10

Trong Python, tôi có một DataFrame gấu trúc tương tự như sau:gấu trúc Python groupby tổng hợp trên nhiều cột, sau đó trục

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 

đâu shop1, shop2 và shop3 là chi phí của tất cả các mục trong các cửa hàng khác nhau. Bây giờ, tôi cần phải trả lại một DataFrame, sau khi một số làm sạch dữ liệu, như thế này:

Category (index)| size| sum| mean | std 
---------------------------------------- 

trong đó kích thước là số mục trong mỗi loại và tổng hợp, có ý nghĩa và std có liên quan đến chức năng tương tự áp dụng cho 3 cửa hàng. Làm cách nào để tôi có thể thực hiện các thao tác này với mẫu kết hợp chia nhỏ áp dụng (nhóm, tổng hợp, áp dụng, ...)?

Ai đó có thể giúp tôi không? Tôi sẽ phát điên với cái này ... cảm ơn!

Trả lời

10

tùy chọn 1
sử dụng agg ← liên kết đến tài liệu

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 

tùy chọn 2
hơn cho ít
sử dụng describe ← liên kết đến tài liệu

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

Hoặc nếu bạn muốn nó trên tất cả các cửa hàng sau đó:

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

Nếu tôi hiểu đúng, bạn muốn tính toán số liệu tổng hợp cho tất cả các cửa hàng, không phải cho mỗi cá nhân. Để làm điều đó, bạn có thể đầu tiên stack dataframe bạn và sau đó nhóm bởi Category:

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

mà kết quả trong

  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 
Các vấn đề liên quan