Pandas-GroupBy,然后在原始表上合并

我正在尝试编写一个函数来汇总并在Pandas中的数据框上执行各种统计数据计算,然后将其合并到原始数据框,但是,我遇到了问题。这与SQL中的代码等效:

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

我的熊猫代码如下:

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

OUT:>> KeyError:您没有名为EID的项目

由于某种原因,分组的数据框无法联接回原始表。我已经研究了尝试将groupby列转换为实际列的方法,但这似乎不起作用。

请注意,最终目标是能够找到每一列(PVALUE,SI,SC,EE)IE的百分比:

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

谢谢!

回答:

默认情况下,groupby输出将分组列作为索引,而不是列,这就是合并失败的原因。

有几种不同的处理方法,最简单的方法可能是as_index在定义groupby对象时使用参数。

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

以上是 Pandas-GroupBy,然后在原始表上合并 的全部内容, 来源链接: utcz.com/qa/412117.html

回到顶部