2015-09-23 10 views
28

एक पांडा dataframe पर एक GroupBy ऐसा करने के लिए, लेकिन वह GroupBy से कुछ स्तंभ को बाहर का सबसे अच्छा तरीका क्या है? जैसे मेरे पास अनुयायी है dataframe:GroupBy द्वारा पांडा राशि है, लेकिन बाहर निकालने के कुछ कॉलम

Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963 
2 Afghanistan 15   Wheat 5312  Ha  10  20  30 
2 Afghanistan 25   Maize 5312  Ha  10  20  30 
4 Angola  15   Wheat 7312  Ha  30  40  50 
4 Angola  25   Maize 7312  Ha  30  40  50 

मैं स्तंभ देश और Item_Code GroupBy के लिए और केवल पंक्तियों कॉलम Y1961, Y1962 और Y1963 के अंतर्गत आने वाले की राशि की गणना करना चाहते हैं। जिसके परिणामस्वरूप dataframe इस तरह दिखना चाहिए:

Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963 
    2 Afghanistan 15  C3  5312  Ha  20  40  60 
    4 Angola  25  C4  7312  Ha  60  80  100 

अभी, मैं यह कर रहा हूं:

df.groupby('Country').sum() 

बहरहाल, यह ऊपर मूल्यों Item_Code कॉलम में रूप में अच्छी तरह कहते हैं। क्या कोई तरीका है कि मैं निर्दिष्ट कर सकता हूं कि कौन से कॉलम योग() ऑपरेशन में शामिल हैं और किसके लिए बाहर निकलना है?

उत्तर

47

आप एक GroupBy के स्तंभों का चयन कर सकते हैं:

In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum() 
Out[11]: 
         Y1961 Y1962 Y1963 
Country  Item_Code 
Afghanistan 15   10  20  30 
      25   10  20  30 
Angola  15   30  40  50 
      25   30  40  50 

ध्यान दें कि पारित सूची कॉलम का सबसेट होना चाहिए अन्यथा आपको एक KeyError दिखाई देगा।

+1

कैसे प्रत्येक देश और एक और स्तंभ के रूप में आइटम कोड के लिए रिकॉर्ड की गिनती शामिल करने के लिए? –

+0

आपको लगता है कि द्वारा समूहीकरण से पहले एक डमी स्तंभ बना सकते हैं सिर्फ 1. तो योग गिनती बनाने उन योग जाएंगे। –

+0

यदि आप केवल कॉलम या दो को बाहर करना चाहते हैं, तो आपको सभी कॉलम नाम 'सूची कॉलम = सूची (df.columns)' के रूप में प्राप्त होते हैं, फिर आप उन स्तंभों को हटाते हैं जिन्हें आप नहीं चाहते हैं, 'listColumns.remove (' Y1964 ') 'और अंत में आपका सारांश करें:' df.groupby (['देश', 'आइटम_Code']) [सूची कॉलम] .sum() ' –

16

agg समारोह आप के लिए यह कर देगा। स्तंभ, उत्पादन के साथ एक dict के रूप में कॉलम और समारोह दर्रा:

df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column 

इस कॉलम के आधार पर केवल समूह है, और निर्दिष्ट कुल स्तम्भों को प्रदर्शित करेगी। इस उदाहरण में मैंने 'वाई 1 9 62' पर लागू दो एजीजी कार्यों को शामिल किया था।

आप वास्तव में क्या देखने के लिए आशा व्यक्त की, द्वारा समूह में अन्य स्तंभों शामिल पाने के लिए, और फ्रेम में Y चरों को रकम लागू होते हैं:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum}) 
+0

धन्यवाद, क्या यह सामान्यीकृत किया जा सकता है? मैं प्रपत्र Y1961 के स्तंभों में से बहुत सारे है ... तो मैं इस तरह एक सूची उत्पन्न: yrs = [ 'वाई' + x के लिए str (एक्स) रेंज में (1961, 2010 + 1, 1)]। क्या आपका समाधान एजीजी के अंदर 'वर्ष' का उपयोग कर सकता है? – user308827

+0

मुझे वास्तव में यह विचार पसंद है। चाल इस ताना का निर्माण मूल्य के साथ numpy योग समारोह के साथ कर रहा है। इसके विपरीत, हालांकि, अगर सब आप क्या करना चाहते राशि शेष कॉलम के सभी है, अपने मूल-ish समाधान काम करता है, तो कॉलम द्वारा समूह के सभी बयान से समूह में शामिल किए गए हैं जाएगा। – leroyJr

3

यदि आप कई कॉलम पर लागू करने के लिए एक अधिक सामान्यीकृत तरीका ढूंढ रहे हैं, तो आप कॉलम नामों की एक सूची बनाने और समूहबद्ध डेटाफ्रेम के सूचकांक के रूप में इसे पास करने के लिए क्या कर सकते हैं। आपके मामले में, उदाहरण के लिए:

columns = ['Y'+str(i) for year in range(1967, 2011)] 

df.groupby('Country')[columns].agg('sum') 
संबंधित मुद्दे