2014-10-19 5 views
17

मैंने डेटा-फ्रेम के प्रत्येक कॉलम पर सारांश आंकड़े चलाने के लिए अक्सर पांडा 'agg() फ़ंक्शन का उपयोग किया है।पायथन पांडा: समूहby() और agg() का उपयोग करते समय ऑर्डर संरक्षित है?

df = pd.DataFrame({'A': ['group1', 'group1', 'group2', 'group2', 'group3', 'group3'], 
        'B': [10, 12, 10, 25, 10, 12], 
        'C': [100, 102, 100, 250, 100, 102]}) 

>>> df 
[output] 
     A B C 
0 group1 10 100 
1 group1 12 102 
2 group2 10 100 
3 group2 25 250 
4 group3 10 100 
5 group3 12 102 

उन दोनों मामलों में, क्रम में है कि अलग-अलग पंक्तियों agg समारोह के लिए भेजा जाता कोई फर्क नहीं पड़ता: उदाहरण के लिए, यहाँ आप कैसे माध्य और मानक विचलन का उत्पादन होता है। लेकिन निम्न उदाहरण है, जो विचार करें:

df.groupby('A').agg([np.mean, lambda x: x.iloc[1] ]) 

[output] 

     mean <lambda> mean <lambda> 
A          
group1 11.0  12 101  102 
group2 17.5  25 175  250 
group3 11.0  12 101  102 

इस मामले में लैम्ब्डा कार्यों के रूप में इरादा, प्रत्येक समूह में दूसरी पंक्ति outputting। हालांकि, मुझे पांडा दस्तावेज में कुछ भी नहीं मिला है जिसका अर्थ है कि यह सभी मामलों में सत्य होने की गारंटी है। मैं भारित औसत फ़ंक्शन के साथ agg() का उपयोग करना चाहता हूं, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि फ़ंक्शन में आने वाली पंक्तियां उसी डेटा क्रम में होंगी जैसा वे मूल डेटा फ्रेम में दिखाई देते हैं।

क्या किसी को पता है कि आदर्श रूप से डॉक्स या पांडा स्रोत कोड में कहीं भी, अगर यह मामला होने की गारंटी है?

+1

हाँ, मैं किसी भी गारंटी देता है कि आदेश डॉक्स में संरक्षित है नहीं देख सकते हैं, तो यह थोड़ा मूर्ख इस पर निर्भर प्रतीत होता है। अगर ऑर्डरिंग आपके 'बी' कॉलम द्वारा प्रतिबिंबित होती है तो आप सुनिश्चित करने के लिए लैम्बडा के भीतर प्रत्येक समूह को 'बी' द्वारा सॉर्ट कर सकते हैं। – Marius

+0

दुर्भाग्य से मैं उन स्तंभों द्वारा आदेशित पंक्तियां रखना चाहता हूं जो एकत्रीकरण में शामिल नहीं हैं। डेटा फ्रेम को 'agg()' कॉल से पहले क्रमबद्ध किया जाता है, इसलिए यह केवल एक समस्या है यदि यह इसे 'groupby() 'के हिस्से के रूप में संदर्भित करता है। – BringMyCakeBack

उत्तर

13

इस वृद्धि issue

संक्षिप्त उत्तर हाँ, GroupBy orderings सुरक्षित करेगा में पारित के रूप में रही है या नहीं आप इस तरह अपने उदाहरण का उपयोग करके यह साबित कर सकते हैं:।

In [20]: df.sort_index(ascending=False).groupby('A').agg([np.mean, lambda x: x.iloc[1] ]) 
Out[20]: 
      B    C   
     mean <lambda> mean <lambda> 
A         
group1 11.0  10 101  100 
group2 17.5  10 175  100 
group3 11.0  10 101  100 

यह सच नहीं है उदाहरण के लिए हालांकि इसे एक मोनोटोनिक इंडेक्स की आवश्यकता होती है (यह एक गैर-मोनोटोनिक इंडेक्स के साथ काम करेगा, लेकिन इसे पहले सॉर्ट करेगा)।

उनका समूह sort= समूह के लिए ध्वज है, लेकिन यह समूह के क्रमबद्ध करने से संबंधित है, न कि समूह के भीतर अवलोकन।

FYI करें:

import pandas as pd 
    pd.pivot_table(df,index='A',aggfunc=(np.mean)) 

उत्पादन: df.groupby('A').nth(1) एक सुरक्षित तरीका (जैसा कि ऊपर अपने विधि असफल हो जायेगी अगर एक समूह < 2 तत्व है) एक समूह के 2 मूल्य प्राप्त करने के

+0

स्पष्टीकरण और समस्या लिंक के लिए धन्यवाद! मैंने मूल रूप से 'iloc' का उदाहरण एक उदाहरण के रूप में उपयोग किया क्योंकि मैं यह नहीं समझ पाया कि' agth() 'कॉल में' agg() 'कॉल में कैसे गुजरना है (क्योंकि उस बिंदु पर' x' एक श्रृंखला है)। क्या डेटाफ्रेम सदस्य फ़ंक्शन के अलावा 'nth()' को कॉल करने का कोई तरीका है? – BringMyCakeBack

+0

'' nth'' केवल समूहबी पर परिभाषित किया गया है। डेटाफ्रेम सदस्य फ़ंक्शन के अलावा 'आपका क्या मतलब है? – Jeff

+0

मेरा मतलब था कि मैं यह नहीं समझ सकता कि 'nth() 'को' agg()' में सूचीबद्ध कार्यों में से एक के रूप में कैसे पास किया जाए। आप '.agg ([np.mean, nth])', या 'DataFrame.nth()' या 'lambda x: x.nth (2) 'नहीं कर सकते।यही कारण है कि मुझे इलोक का नेतृत्व किया, हालांकि यह इंडेक्स त्रुटियों को फेंक देगा। सबसे अच्छा तरीका यह है कि इसे एक ही चरण में करने की कोशिश न करें; पहले 'nth() 'का उपयोग करें, फिर' agg()' का उपयोग करें, फिर उन्हें मर्ज करें। – BringMyCakeBack

0

भी आसान है:

  B C 
    A     
    group1 11.0 101 
    group2 17.5 175 
    group3 11.0 101 
संबंधित मुद्दे