2014-07-27 8 views
14

पर विलय करें मैं पांडों में डेटाफ्रेम पर विभिन्न आंकड़े कैलकुलेशन को करने और फिर मूल डेटाफ्रेम पर विलय करने की कोशिश कर रहा हूं, हालांकि, मैं मुद्दों पर चल रहा हूं।पांडस - ग्रुपबी और फिर मूल तालिका

SELECT EID, 
     PCODE, 
     SUM(PVALUE) AS PVALUE, 
     SUM(SQRT(SC*EXP(SC-1))) AS SC, 
     SUM(SI) AS SI, 
     SUM(EE) AS EE 
INTO foo_bar_grp 
FROM foo_bar 
GROUP BY EID, PCODE 

और फिर मूल मेज पर शामिल होने:

SELECT * 
FROM foo_bar_grp INNER JOIN 
foo_bar ON foo_bar.EID = foo_bar_grp.EID 
     AND foo_bar.PCODE = foo_bar_grp.PCODE 

ये कदम उठाएँ: >>

pol_dict = {'PID':[1,1,2,2], 
      'EID':[123,123,123,123], 
      'PCODE':['GU','GR','GU','GR'], 
      'PVALUE':[100,50,150,300], 
      'SI':[400,40,140,140], 
      'SC':[230,23,213,213], 
      'EE':[10000,10000,2000,30000], 
      } 


pol_df = DataFrame(pol_dict) 

pol_df 
: डेटा
में लोड हो रहा है यह एसक्यूएल में कोड बराबर है

आउट: >>

EID EE PCODE PID PVALUE SC SI 
0 123 10000 GU 1  100 230 400 
1 123 10000 GR 1  50 23 40 
2 123 2000 GU 2  150 213 140 
3 123 30000 GR 2  300 213 140 

चरण 2: गिना जा रहा है और डेटा पर समूहीकरण: इस प्रकार

मेरे पांडा कोड है:

#create aggregation dataframe 
poagg_df = pol_df 
del poagg_df['PID'] 
po_grouped_df = poagg_df.groupby(['EID','PCODE']) 

#generate acc level aggregate 
acc_df = po_grouped_df.agg({ 
    'PVALUE' : np.sum, 
    'SI' : lambda x: np.sqrt(np.sum(x * np.exp(x-1))), 
    'SC' : np.sum, 
    'EE' : np.sum 
}) 

यह ठीक काम करता है जब तक मैं मूल मेज पर शामिल करना चाहते हैं:

IN: >>

po_account_df = pd.merge(acc_df, po_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po')) 

बाहर: >> KeyError: u'n ओ आइटम नामित ईआईडी '

किसी कारण से, समूहित डेटाफ्रेम मूल तालिका में वापस शामिल नहीं हो सकता है। मैंने समूह कॉलम को वास्तविक कॉलम में बदलने की कोशिश करने के तरीकों पर ध्यान दिया है, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।

pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4) 

धन्यवाद:

कृपया ध्यान दें, अंतिम लक्ष्य प्रत्येक स्तंभ के लिए प्रतिशत (pvalue, एसआई, अनुसूचित जाति, ईई) आईई खोजने के लिए सक्षम होने के लिए है!

उत्तर

31

डिफ़ॉल्ट रूप से, groupby आउटपुट में समूहीकरण के रूप में समूह कॉलम हैं, कॉलम नहीं, यही कारण है कि विलय विफल हो रहा है।

इसे संभालने के कुछ अलग तरीके हैं, संभवतः सबसे आसान as_index पैरामीटर का उपयोग कर रहा है जब आप समूह ऑब्जेक्ट को परिभाषित करते हैं।

po_grouped_df = poagg_df.groupby(['EID','PCODE'], as_index=False) 

फिर, आपके विलय को अपेक्षा के अनुसार काम करना चाहिए।

In [356]: pd.merge(acc_df, pol_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po')) 
Out[356]: 
    EID PCODE SC_Acc EE_Acc  SI_Acc PVALUE_Acc EE_Po PVALUE_Po \ 
0 123 GR  236 40000 1.805222e+31   350 10000   50 
1 123 GR  236 40000 1.805222e+31   350 30000  300 
2 123 GU  443 12000 8.765549e+87   250 10000  100 
3 123 GU  443 12000 8.765549e+87   250 2000  150 

    SC_Po SI_Po 
0  23  40 
1 213 140 
2 230 400 
3 213 140 
संबंधित मुद्दे