我需要数据透视表中索引 PC 的小计。我的输出具有以下代码
df.to_json('filename.xml', orient='split')
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
答案 0 :(得分:1)
使用:
#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)
然后通过concat
和DataFrame.sort_index
添加到原始内容-因为此处ordered Categorical
的{{1}}位于组末尾:
Total