2015-04-21 12 views
9

में मानों के आधार पर मैं एक नया कॉलम बनाने की कोशिश कर रहा हूं जो एक ही डीएफ में मौजूदा कॉलम से मूल्यों का माध्य देता है। हालांकि तीन अन्य स्तंभों में समूहकरण के आधार पर माध्य की गणना की जानी चाहिए।पांडा डेटाफ्रेम सशर्त .mean() कुछ कॉलम

Out[184]: 
    YEAR daytype hourtype scenario option_value  
0 2015  SAT  of_h   0  0.134499  
1 2015  SUN  of_h   1  63.019250  
2 2015  WD  of_h   2  52.113516  
3 2015  WD  pk_h   3  43.126513  
4 2015  SAT  of_h   4  56.431392 

मैं मूल रूप से, एक नया स्तंभ 'मतलब' जो "विकल्प मान" का मतलब की गणना करने के लिए जब "वर्ष", "daytype", और "hourtype" इसी तरह के हैं चाहते हैं।

मैं निम्नलिखित दृष्टिकोण लेकिन सफलता नहीं मिली कोशिश की ...

In [185]: o2['premium']=o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_cf'].mean() 

TypeError: incompatible index of inserted column with frame index 
+1

आप '['option_cf'] को कॉल कर रहे हैं लेकिन आपके डेटाफ्रेम में' ['option_value'] 'है। – ASGM

+0

तो 2015-एसएटी-ऑफ_एच पंक्तियों के लिए, क्या आप चाहते हैं कि उन्हें एक नई पंक्ति में ध्वस्त किया जाए, या क्या आप चाहते हैं कि दोनों पंक्तियां अभी भी मौजूद हों लेकिन वहां "प्रीमियम" कॉलम (उसी) औसत मूल्य के साथ है? – DSM

+0

वास्तव में दोनों पंक्तियां अभी भी मौजूद हैं लेकिन एक ही प्रीमियम मूल्य के साथ "प्रीमियम" कॉलम के साथ .. लेकिन यही है 'नीचे प्रस्तावित! – tpapz

उत्तर

7

यहाँ एक तरह से करना है यह

In [19]: def cust_mean(grp): 
    ....:  grp['mean'] = grp['option_value'].mean() 
    ....:  return grp 
    ....: 

In [20]: o2.groupby(['YEAR', 'daytype', 'hourtype']).apply(cust_mean) 
Out[20]: 
    YEAR daytype hourtype scenario option_value  mean 
0 2015  SAT  of_h   0  0.134499 28.282946 
1 2015  SUN  of_h   1  63.019250 63.019250 
2 2015  WD  of_h   2  52.113516 52.113516 
3 2015  WD  pk_h   3  43.126513 43.126513 
4 2015  SAT  of_h   4  56.431392 28.282946 

तो, क्या आपके प्रयास के साथ गलत हो रहा था?

यह मूल डेटाफ्रेम से अलग आकार के साथ कुल मिलाकर देता है।

o2 = o2.set_index(['YEAR', 'daytype', 'hourtype']) 

o2['premium'] = o2.groupby(level=['YEAR', 'daytype', 'hourtype'])['option_value'].mean() 

क्यों मूल त्रुटि:

In [21]: o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_value'].mean() 
Out[21]: 
YEAR daytype hourtype 
2015 SAT  of_h  28.282946 
     SUN  of_h  63.019250 
     WD  of_h  52.113516 
       pk_h  43.126513 
Name: option_value, dtype: float64 

या उपयोग transform

In [1461]: o2['premium'] = (o2.groupby(['YEAR', 'daytype', 'hourtype'])['option_value'] 
           .transform('mean')) 

In [1462]: o2 
Out[1462]: 
    YEAR daytype hourtype scenario option_value premium 
0 2015  SAT  of_h   0  0.134499 28.282946 
1 2015  SUN  of_h   1  63.019250 63.019250 
2 2015  WD  of_h   2  52.113516 52.113516 
3 2015  WD  pk_h   3  43.126513 43.126513 
4 2015  SAT  of_h   4  56.431392 28.282946 
+1

बहुत धन्यवाद, यह अच्छी तरह से काम करता है। हालांकि एक प्रश्न .. आपकी विधि कैसे समेकित आउटपुट को वापस नहीं लाती है? – tpapz

1

आप इसे जिस तरह से आप निम्नलिखित तरीके से अपने कोड अदल-बदल करके इरादा कर सकते हैं? जैसा कि जॉन गल्ट द्वारा समझाया गया है, ग्रुपबी() से बाहर आने वाला डेटा मूल() मूल डेटाफ्रेम के समान आकार (लंबाई) नहीं है।

यदि आप पहली बार इंडेक्स में 'ग्रुपिंग कॉलम' से शुरू करते हैं तो पांडो इस चालाकी से संभाल सकते हैं। फिर यह जानता है कि सही डेटा को सही तरीके से कैसे प्रचारित किया जाए।

जॉन का समाधान एक ही तर्क का पालन करता है, क्योंकि समूह स्वाभाविक रूप से निष्पादन के दौरान सूचकांक में समूह कॉलम डालता है।

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