将Pandas MultiIndex索引名称设置为与列名称相同的级别

时间:2019-09-04 10:20:57

标签: python pandas

我有一个熊猫数据框:

enter image description here

行和列都是多索引。

列如下:

MultiIndex(levels=[['1pm', '4pm'], ['% change', '2018', '2019']],
           codes=[[0, 0, 0, 1, 1, 1], [2, 1, 0, 2, 1, 0]],
           names=['', ''])

行如下所示:

MultiIndex(levels=[['Live game', 'RedZone'], ['Sky Sports Action', 'Sky Sports Main Event', 'Sky Sports Mix', 'Total']],
           codes=[[0, 0, 0, 1, 1], [0, 1, 3, 2, 3]],
           names=['Programme', 'Channel'])

我想通过消除数据和列名称之间的差距,将“程序和频道”设置为与2019、2018和%变化相同的水平。这可能吗?

我希望最终将其输出到Excel,所以我知道最终可以使用openpyxl(或类似方法)移动单元格。但理想情况下,如果可以在此阶段完成,那就太好了。

(我知道总计行和%变化列不正确,这只是虚拟数据)

1 个答案:

答案 0 :(得分:0)

解决此问题的一种解决方法是分别保存标题和表内容:

m1 = pd.MultiIndex.from_product([['1pm', '4pm'], ['% change', '2018', '2019']], names=['', ''])
m2 = pd.MultiIndex.from_product([['Live game', 'RedZone'], ['Sky Sports Action', 'Sky Sports Main Event', 'Sky Sports Mix', 'Total']], names=['Programme', 'Channel'])

df = pd.DataFrame(1, index=m2, columns=m1)

#https://github.com/pandas-dev/pandas/issues/6618#issuecomment-382405067
writer = pd.ExcelWriter("test.xlsx")
headers = pd.DataFrame(df.columns.tolist()).T
#added index names for avoid lost ['Programme', 'Channel']
names =  pd.DataFrame([df.index.names], index=[headers.index.max()])
headers = pd.concat([names, headers], axis=1)

headers.to_excel(writer, header=False, index=False)
df.index.names = [None, None]
df.to_excel(writer, header=False, startrow=len(headers)-1)
writer.save()
相关问题