2017-04-02 24 views
10

अजगर में, मैं एक पांडा DataFrame निम्न के समान है:अजगर पांडा एकाधिक स्तंभों पर कुल GroupBy, तो धुरी

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 

कहाँ shop1, shop2 और shop3 विभिन्न दुकानों में हर आइटम के खर्च कर रहे हैं। अब, मैं, एक DataFrame वापस जाने के लिए, कुछ डेटा सफाई के बाद की जरूरत है इस तरह:

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

जहां आकार प्रत्येक श्रेणी और योग में आइटमों की संख्या है, इसका मतलब और एसटीडी के लिए आवेदन किया ही कार्य से जुड़े हुए हैं 3 दुकानें मैं इन परिचालनों को विभाजन-लागू-गठबंधन पैटर्न (समूह, कुल, लागू, ...) के साथ कैसे कर सकता हूं?

क्या कोई मेरी मदद कर सकता है? मैं इस के साथ पागल हो रहा हूँ ... धन्यवाद!

उत्तर

10

विकल्प 1
उपयोग agg ← लिंक परिणाम डॉक्स

: ऐसा करने के लिए, आपको पहले stack अपने dataframe और Category द्वारा उसके बाद समूह कर सकते हैं
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 

विकल्प 2
कम
उपयोग describe ← लिंक के लिए अधिक डॉक्स

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

या आप यह तो सभी दुकानों भर में चाहते हैं:

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 
संबंधित मुद्दे