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

标签 python python-2.7 pandas

我正在尝试编写一个函数来聚合并在 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

第 2 步:对数据进行计算和分组:

我的 Pandas 代码如下:

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

在我想加入原始表之前,这可以正常工作:

在:>>

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

输出:>> KeyError: u'no item named 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 输出将分组列作为索引,而不是列,这就是合并失败的原因。

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

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  

关于python - Pandas - GroupBy 然后在原始表上合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24980437/

相关文章:

bash - Shell-Script Python 调用失败并出现语法错误

python - urllib2 中的未知 url 类型错误

python - 获取 Pandas 行中最大值的列索引

python - 如何在Python中利用字节数组的每一位

python - python中包的全局变量可以被认为是邪恶的吗?

python - 在 SQL Server 中运行 Python 脚本时接受 EULA 错误

python - 导入错误 : cannot import name murmurhash3_32

python - 如何将 Pandas 中的重复编号列转换为单个非编号列?

python - 如何在 matplotlib 中使用时间序列绘制各个行值

python - hashlib.sha1 库中的值可以在 Python 版本之间更改吗?