我尝试使用Pandas创建一个简单的Excel样式的带有小计的数据透视表,但我找不到一种方法。我已经尝试了Wes在另一个与小计相关的问题中提出的解决方案,但那并没有给出期望的结果。以下是复现步骤:
创建示例数据:
sample_data = {'customer': ['A', 'A', 'A', 'B', 'B', 'B', 'A', 'A', 'A', 'B', 'B', 'B'], 'product': ['astro','ball','car','astro','ball', 'car', 'astro', 'ball', 'car','astro','ball','car'],
'week': [1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2],
'qty': [10, 15, 20, 40, 20, 34, 300, 20, 304, 23, 45, 23]}
df = pd.DataFrame(sample_data)
创建带有边距的数据透视表(仅包含总计,不包含按客户(A、B)小计的内容)。
piv = df.pivot_table(index=['customer','product'],columns='week',values='qty',margins=True,aggfunc=np.sum)
week 1 2 All
customer product
A astro 10 300 310
ball 15 20 35
car 20 304 324
B astro 40 23 63
ball 20 45 65
car 34 23 57
All 139 715 854
接着,我尝试了Wes Mckiney在另一个帖子中提到的方法,使用堆栈函数:
piv2 = df.pivot_table(index='customer',columns=['week','product'],values='qty',margins=True,aggfunc=np.sum)
piv2.stack('product')
结果的格式符合我的要求,但是“全部”行没有求和:
week 1 2 All
customer product
A NaN NaN 669.0
astro 10.0 300.0 NaN
ball 15.0 20.0 NaN
car 20.0 304.0 NaN
B NaN NaN 185.0
astro 40.0 23.0 NaN
ball 20.0 45.0 NaN
car 34.0 23.0 NaN
All NaN NaN 854.0
astro 50.0 323.0 NaN
ball 35.0 65.0 NaN
car 54.0 327.0 NaN
如何使其像Excel中那样工作,下面是示例?所有小计和总计都能正常工作吗?我错过了什么吗?ed excel示例 只是想指出,我可以使用For循环,在每次迭代时按客户进行过滤,稍后进行连接,但我希望可能有更直接的解决方案,谢谢。
df.loc[('B','total'), :]
- Scott Boston