我有一个熊猫数据框:
行和列都是多索引。
列如下:
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(或类似方法)移动单元格。但理想情况下,如果可以在此阶段完成,那就太好了。
(我知道总计行和%变化列不正确,这只是虚拟数据)
答案 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()