这是我的代码:
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
我的问题是:
例如:
buc1 A B
(0, 2] 3 6.5
(2, 6] 12 12
Total 15 9.8
请注意,第二列的总行数是平均值,而不是总和。
答案 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)