python-3.x - 数据透视表中索引的小计
问题描述
我需要数据透视表中索引PC的小计。我的输出有以下代码
data_frame1 = pd.pivot_table(data_frame, index=['PC, 'Geo', 'Comp'], values=['Bill1', 'Bill2'], columns=['Month'], fill_value=0)
data_frame1 = data_frame1.swaplevel(0,1, axis=1).sort_index(axis=1)
tuples = [(a.strftime('%b-%y'), b) if a!= 'All' else (a,b) for a,b in data_frame1.columns]
data_frame1.columns = pd.MultiIndex.from_tuples(tuples)
输出:
jan-19 Feb-19
Bill1 Bill2 Bill1 Bill2
PC Geo Comp
A Ind OS 1 1.28 1 1.28
B US OP 1 1.28 1 1.28
C Can OV 1 1.28 1 1.28
期望的输出
jan-19 Feb-19
Bill1 Bill2 Bill1 Bill2
PC Geo Comp
A Ind OS 1 1.28 1 1.28
Total 1 1.28 1 1.28
B US OP 1 1.28 1 1.28
Total 1 1.28 1 1.28
C Can OV 1 1.28 1 1.28
Total 1 1.28 1 1.28
解决方案
采用:
#change sample data for added 1 row for check if working sum
print (df)
jan-19 Feb-19
Bill1 Bill2 Bill1 Bill2
PC Geo Comp
A Ind OS 1 1.28 1 1.28
OP 8 2.00 1 1.00
B US OV 1 1.28 1 1.28
C Can OV 1 1.28 1 1.28
这是正确排序Total
到每个组末尾的问题,因此将第三级转换为CategoricalIndex
设置顺序 - 最后一个值为Total
:
lev = df.index.get_level_values(2)
cat = lev.unique().tolist() + ['Total']
df.index = [df.index.get_level_values(0),
df.index.get_level_values(1),
pd.CategoricalIndex(lev, categories=cat, ordered=True)]
然后sum
每个第一级和第二级的值 ( PC
, Geo
) 并将Total
值添加到第三级:
df1 = df.sum(level=[0,1]).assign(name='Total').set_index('name', append=True)
然后添加到原始 byconcat
和DataFrame.sort_index
- 因为ordered Categorical
这Total
是在组的末尾:
df = pd.concat([df, df1]).sort_index()
print (df)
jan-19 Feb-19
Bill1 Bill2 Bill1 Bill2
PC Geo Comp
A Ind OS 1 1.28 1 1.28
OP 8 2.00 1 1.00
Total 9 3.28 2 2.28
B US OV 1 1.28 1 1.28
Total 1 1.28 1 1.28
C Can OV 1 1.28 1 1.28
Total 1 1.28 1 1.28
推荐阅读
- joomla - 创建语言文件 joomla 3.8.3 (php 相关)
- pouchdb - PouchDB - Map reduce 查询不适用于 websql 适配器
- excel - 用于单元格格式的 VBA 代码链接到工作簿中的另一个工作表
- minio - 如何将对象从一个存储桶移动到另一个存储桶?
- visual-studio - Azure 部署防火墙问题
- c# - .net core Identity,获取特定的注册错误条件
- c++ - 使用 QtBluetooth 读取广告包
- ms-access - 向全球用户分发访问表单以进行验证或修改
- django - 使用按钮在 IntegerField 上添加值(Django 1.11)
- api - .net core - 如何在 AuthorizationHandler 上返回 403?