2014-07-27 28 views
14

Pandalar'daki bir veri karmasındaki çeşitli istatistik hesaplarını toplamak ve gerçekleştirmek için bir işlev yazmaya çalışıyorum ve daha sonra bunları orijinal veri alanına birleştiriyorum;Pandalar - GroupBy ve ardından orijinal tabloya birleştirme

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 

Ve sonra orijinal masaya katılmak: Burada

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 

adımlar şunlardır: >>

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 
: Veri İÇİNDE
yükleme Bu SQL kod eşdeğerdir

OUT: >>

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 

Adım 2: verilere hesaplama ve Gruplama şu şekildedir:

Benim pandalar kodudur:

#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 
}) 

Ben orijinal masaya katılmak isteyen kadar bu çalışıyor:

IN: >>

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

OUT: >> KeyError: u'n o öğe EID '

Gruplandırılmış veri çerçevesi, herhangi bir nedenle, orijinal tabloya geri katılamaz. Grup dizisi sütunlarını gerçek sütunlara dönüştürmeye çalışmanın yollarını inceledim, ancak bu işe yaramıyor.

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

Teşekkür:

unutmayın, nihai amacın her sütun için yüzdesini (pvalue, SI, SC, EE) IE bulmak mümkün olmaktır!

cevap

31

Varsayılan olarak, groupby çıkışında sütunlar sütunlar değil, belirteçler olarak gruplandırılır; bu nedenle birleştirme başarısız oluyor.

Bunu işlemek için birkaç farklı yol vardır, gruptaki nesneyi tanımlarken muhtemelen en kolayı as_index parametresini kullanır.

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

Ardından, birleştirme beklendiği gibi çalışmalıdır.

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 
İlgili konular