2014-07-27 38 views
14

Tôi đang cố gắng viết một hàm tổng hợp và thực hiện các số liệu thống kê khác nhau trên một khung dữ liệu trong Pandas và sau đó hợp nhất nó vào dataframe ban đầu, tuy nhiên, tôi đang chạy đến các vấn đề. Đây là mã tương đương trong SQL:Pandas - GroupBy và sau đó Merge trên bảng gốc

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 

Và sau đó tham gia vào bảng gốc:

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 

Dưới đây là các bước: Đang tải dữ liệu IN: >>

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 

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 

Bước 2: Tính toán và Nhóm trên các dữ liệu:

đang gấu trúc của tôi là như sau:

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

này hoạt động tốt cho đến khi tôi muốn tham gia vào bảng gốc:

IN: >>

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

OUT: >> KeyError: u'n o mục có tên EID '

Vì lý do nào đó, khung dữ liệu được nhóm không thể tham gia trở lại bảng gốc. Tôi đã nhìn vào cách cố gắng để chuyển đổi các cột groupby thành cột thực tế nhưng điều đó dường như không hoạt động.

Xin lưu ý, mục tiêu cuối cùng là để có thể tìm ra tỷ lệ cho mỗi cột (pvalue, SI, SC, EE) IE:

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

Cảm ơn!

Trả lời

31

Theo mặc định, đầu ra groupby có các cột nhóm làm chỉ báo chứ không phải cột, đó là lý do tại sao hợp nhất không thành công.

Có một vài cách khác nhau để xử lý, có lẽ cách dễ nhất là sử dụng tham số as_index khi bạn xác định đối tượng groupby.

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

Sau đó, hợp nhất của bạn sẽ hoạt động như mong đợi.

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 
Các vấn đề liên quan