pandas groupby 聚合,总和在底部

Jas*_*son 6 group-by aggregate subtotal pandas

这是我的代码:

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
           }
Run Code Online (Sandbox Code Playgroud)

运行后:

df.groupby(['buc1']).agg(aggFunc)
Run Code Online (Sandbox Code Playgroud)

我得到:

         A     B
buc1            
(0, 2]   3   6.5
(2, 6]  12  12.0
(6, 8] NaN   NaN
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 鉴于那里没有值,我如何摆脱底部 (6, 8] 存储桶?
  2. 如何在底部添加总计行,如 Excel 中的数据透视表?

例如:

buc1    A   B
(0, 2]  3   6.5
(2, 6]  12  12
Total   15  9.8
Run Code Online (Sandbox Code Playgroud)

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

ako*_*ako 5

要删除na记录,您可以使用.dropna()dataframe 方法。

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

但它引发了与 相关的错误,我认为这是一个应该修复的错误,因此它可以在您的机器上运行(尽管我运行的是 0.17 版)

同一个链接有一个与分类变量相关的变通方法——首先将它作为一个对象进行转换,上面的调用应该是好的。

编辑:

如果您想继续使用 groupby 语义,您可以添加一行总计,如下所示:

rowtotal = result.sum()
rowtotal.name = 'rowtotal'
result.append(rowtotal)
Run Code Online (Sandbox Code Playgroud)