Pandas DataFrame中的多步聚合

时间:2016-12-30 02:01:51

标签: python python-3.x pandas

在Pandas中,如何对同一数据集进行多步/顺序聚合?好像每个步骤都是"子查询"下一个。

我可以在SQL中这样想:

SELECT x.A, COUNT(x.B) as B_COUNT, SUM(x.C_SUM) as C_SUM
FROM (
    SELECT df.A, df.B, SUM(df.C) as C_SUM
    FROM df
    GROUP BY df.A, df.B
) x
GROUP BY x.A

使用Python3.4和Pandas0.19.2,我有一个这样的数据框:

import pandas
import numpy

numpy.random.seed(1)
df = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                          'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three',
                          'two', 'two', 'one', 'three'],
                   'C' : numpy.random.randn(8),
                   'D' : numpy.random.randn(8)})

我已尝试汇总到A,B级别,然后处理该数据帧(即,但它的索引是' C'以及列' A' ;抛出一个KeyError,因为它不在键列表中。

A_B_AGG = df.groupby(['A','B']).C.sum().to_frame()
A_B_AGG.keys()
#Index(['C'], dtype='object')
#Would like to do this, but throws KeyError
end_result = A_B_AGG.groupby('A').B.size()

最终,我应该得到一些看起来像......

A    B_COUNT      C_SUM
bar        3  -3.986264
foo        3   2.945186

感谢您提供有关正确的熊猫方式的任何指导!

1 个答案:

答案 0 :(得分:1)

您可以使用agg功能:

df.groupby('A').agg({'B': pandas.Series.nunique, 'C': 'sum'})

#               C   B
#A      
#bar    -3.986264   3
#foo     2.945186   3

我认为这等同于您的SQL查询的原因是当您按列A和B进行分组时,每个A组中不会有B的重复。因此,按A分组的B的计数与按A分组的B的唯一计数相同;对于C sum,子组的总和与组的总和相同。

这是你的sql查询的直接翻译,我认为这在逻辑上等同于上面的方法:

(df.groupby(['A', 'B']).C.sum().reset_index()
   .groupby('A').agg({'B': 'count', 'C': 'sum'}))

#               C   B
# A     
#bar    -3.986264   3
#foo     2.945186   3