pandas groupby总计在底部汇总

时间:2015-10-27 17:19:12

标签: pandas group-by aggregate subtotal

这是我的代码:

import StringIO
from pandas import *
import numpy as np

df = read_csv(StringIO.StringIO('''Col1 Col2    A   B
A   D   1   6
A   E   2   7
B   D   3   8
B   E   4   9
C   D   5   19'''), delimiter='\t')


df['buc1'] = cut(df['A'], bins = [0, 2, 6, 8])

aggFunc = {'A': sum,
           'B': np.average
           }

跑完后:

df.groupby(['buc1']).agg(aggFunc)

我明白了:

         A     B
buc1            
(0, 2]   3   6.5
(2, 6]  12  12.0
(6, 8] NaN   NaN

我的问题是:

  1. 如果那里没有值,我如何摆脱底部(6,8)桶?
  2. 如何在底部添加总计行,如Excel中的数据透视表?
  3. 例如:

    buc1    A   B
    (0, 2]  3   6.5
    (2, 6]  12  12
    Total   15  9.8
    

    请注意,第二列的总行数是平均值,而不是总和。

1 个答案:

答案 0 :(得分:3)

要删除na条记录,您可以使用.dropna()数据框方法。

df['buc1'] = df['buc1'].astype(object) 
result = df.groupby(['buc1']).agg(aggFunc).dropna()
result


         A     B
buc1            
(0, 2]   3   6.5
(2, 6]  12  12.0

至于边际总数,理论上这应该有效:

result_alternative = pd.pivot_table(df,index='buc1',
                                    aggfunc=aggFunc,
                                    values=['A','B'],
                                    margins=True)
result_alternative

         A     B
buc1            
(0, 2]   3   6.5
(2, 6]  12  12.0
All     15   9.8

但它会抛出一个与我相关的错误,我认为应该修复bug以便它可以在您的计算机上运行(尽管我运行的是0.17版本)

同一个链接有一个与分类变量相关的解决方法 - 首先将它作为一个对象投射,上面的调用应该是好的。

编辑:

如果你想继续使用groupby语义,可以像这样添加一行总数:

rowtotal = result.sum()
rowtotal.name = 'rowtotal'
result.append(rowtotal)