2016-11-03 9 views
5

में अन्य रखें, मेरा प्रश्न पांडा के साथ ग्रुपबी ऑपरेशन के बारे में है। मैं स्तंभ बी द्वारा समूहीकृत करना चाहते हैं और स्तंभ ए पर एक योग करते हैं लेकिन अंत में, मैं स्तंभ सी चाहते हैं अभी भी होने के लिए:एक कॉलम पर पांडस ग्रुपबी ऑपरेशन कैसे करें, लेकिन परिणामी डेटाफ्रेम

In [4]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]}) 

In [5]: df 
Out[5]: 
    A B  C 
0 0 PO Est 
1 1 PO Est 
2 2 PA West 
3 3 PA West 

यह मैं करना चाहते हैं क्या है: मैं निम्नलिखित DataFrame है डेटाफ्रेम में। यदि मैं करता हूं:

In [8]: df.groupby(by="B").aggregate(pd.np.sum) 
Out[8]: 
    A 
B  
PA 5 
PO 1 

यह नौकरी करता है लेकिन कॉलम सी गुम है। मैं भी ऐसा कर सकते हैं:

In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum) 
Out[9]: 
     A 
B C  
PA West 5 
PO Est 1 

या

In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum) 
Out[11]: 
    B  C A 
0 PA West 5 
1 PO Est 1 

लेकिन दोनों ही मामलों में यह बी और सी और सिर्फ बी और सी मूल्य रखता है नहीं द्वारा समूह। क्या मैं अप्रासंगिक करना चाहता हूं या ऐसा करने का कोई तरीका है?

उत्तर

8

dict of {column -> function} साथ DataFrameGroupBy.agg() विधि का उपयोग करने का प्रयास करें:

In [6]: df.groupby('B').agg({'A':'sum', 'C':'first'}) 
Out[6]: 
     C A 
B 
PA West 5 
PO Est 1 

डॉक्स से: समूहों के योग के लिए उपयोग करने के लिए

समारोह। यदि कोई फ़ंक्शन, डेटाफ्रेम पारित होने पर या DataFrame.apply पर जाने पर कार्य करना चाहिए। यदि ने एक निर्देश पारित किया है, तो कुंजी डेटाफ्रेम कॉलम नाम होना चाहिए। अपने लक्ष्यों के आधार पर

या कुछ इस तरह:

In [8]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est1", "Est2", "West1", "West2"]}) 

In [9]: df.groupby('B').agg({'A':'sum', 'C':'first'}) 
Out[9]: 
     C A 
B 
PA West1 5 
PO Est1 1 

In [10]: df['sum_A'] = df.groupby('B')['A'].transform('sum') 

In [11]: df 
Out[11]: 
    A B  C sum_A 
0 0 PO Est1  1 
1 1 PO Est2  1 
2 2 PA West1  5 
3 3 PA West2  5 
+0

यह काम करता है और यदि 'C' मूल्य सभी मूल्यों कि वर्गीकृत किया जा रहा है पर एक ही है। अन्यथा 'विलय' नौकरी करेगा। – Khris

+0

@ क्रिसिस, आपके संकेत के लिए धन्यवाद! मैंने एक वैकल्पिक समाधान जोड़ा है जो '.transform()' विधि – MaxU

+0

अद्भुत का उपयोग करता है !! बहुत बहुत धन्यवाद। – Ger

संबंधित मुद्दे