समूह द्वारा पंडों का योग, लेकिन कुछ स्तंभों को छोड़ दें


88

पंडों के डेटाफ्रेम पर एक ग्रुपबाई करने का सबसे अच्छा तरीका क्या है, लेकिन उस समूह से कुछ कॉलम को बाहर कर दें? उदाहरण के लिए मेरे पास निम्नलिखित डेटाफ्रेम हैं:

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 को समूहीकृत करना चाहता हूं और केवल कॉलम Y1961, Y1962 और Y1963 के तहत आने वाली पंक्तियों के योग की गणना करता हूं। परिणामी डेटाफ़्रेम इस तरह दिखना चाहिए:

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 कॉलम में मानों को भी जोड़ता है। क्या कोई तरीका है जो मैं निर्दिष्ट कर सकता हूं कि sum()ऑपरेशन में कौन से कॉलम शामिल करने हैं और किन लोगों को बाहर करना है?

जवाबों:


117

आप एक समूह के कॉलम का चयन कर सकते हैं:

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
प्रत्येक देश और आइटम कोड के रिकॉर्ड को अन्य कॉलम के रूप में कैसे शामिल किया जाए?
सुशांत कुलकर्णी

आप समूह में शामिल होने से पहले एक डमी कॉलम बना सकते हैं, जिसमें सिर्फ 1. शामिल है, फिर योग एक गिनती बनाने वालों को योग देगा।
मैट डब्ल्यू।

यदि आप केवल एक कॉलम या दो को बाहर करना चाहते हैं, तो आपको सभी कॉलम के नाम मिलते हैं जैसे आप listColumns = list(df.columns)तब कॉलम को हटा देते हैं जो आप नहीं चाहते हैं, listColumns.remove('Y1964')और अंत में अपना योग करें:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
रॉबर्टो स्टेलिंग

बहुत बहुत धन्यवाद। मुझे काम करने के लिए समूह मिल सकता है, लेकिन चयन का हिस्सा नहीं। मेरे द्वारा डाले गए स्तंभों की सूची डेटाफ़्रेम के बीच में है, लेकिन यह मान बढ़ाता है:cannot reindex from a duplicate axis
बोवेन लियू

@BowenLiu यदि आपके पास एक ही नाम के साथ कई कॉलम हैं तो यह त्रुटि दिखाएगा। इस स्थिति में, आपको अपने इच्छित कॉलम को प्राप्त करने के लिए iloc या loc का उपयोग करना होगा, मुझे लगता है कि आपको ग्रुपबी से पहले ऐसा करना होगा।
एंडी हेडन

40

aggसमारोह आप के लिए यह कर देगा। स्तंभों को पास करें और स्तंभ, आउटपुट के साथ कार्य करें।

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

यह केवल समूह को कॉलम और निर्दिष्ट कुल कॉलम को प्रदर्शित करेगा। इस उदाहरण में मैंने 'Y1962' पर लागू दो एग कार्यों को शामिल किया।

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

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

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

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

11

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

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

df.groupby('Country')[columns].agg('sum')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.