在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
感谢您提供有关正确的熊猫方式的任何指导!
答案 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