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!