回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图编写一个函数来聚合和执行Pandas中一个数据帧上的各种统计计算,然后将其合并到原始数据帧。然而,我遇到了一些问题。这在SQL中是等价的代码:</p>
<pre><code>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
</code></pre>
<p>然后在原始表上联接:</p>
<pre><code>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
</code></pre>
<p><strong>以下是步骤:加载数据
输入:>;></p>
<pre><code>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
</code></pre>
<p>输出:>;></p>
<pre><code> 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
</code></pre>
<p><strong>步骤2:对数据进行计算和分组:</strong></p>
<p>我的熊猫代码如下:</p>
<pre><code>#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
})
</code></pre>
<p>在我想加入原始表之前,此操作正常:</p>
<p>输入:>;></p>
<pre><code>po_account_df = pd.merge(acc_df, po_df, on=['EID','PCODE'], how='inner',suffixes=('_Acc','_Po'))
</code></pre>
<p>输出:>;>;
KeyError:u'没有名为EID的项'</p>
<p>由于某些原因,分组的数据帧无法连接回原始表。我已经研究了尝试将groupby列转换为实际列的方法,但这似乎不起作用。</p>
<p>请注意,最终目标是能够找到每个列(PVALUE、SI、SC、EE)的百分比,即:</p>
<pre><code>pol_acc_df['PVALUE_PCT'] = np.round(pol_acc_df.PVALUE_Po/pol_acc_df.PVALUE_Acc,4)
</code></pre>
<p>谢谢!</p>