以长格式保存具有不同级别名称的多索引列 Pandas 为 excel 格式
Posted
技术标签:
【中文标题】以长格式保存具有不同级别名称的多索引列 Pandas 为 excel 格式【英文标题】:Save as excel format a multi index column Pandas with diffrent level names in a long format 【发布时间】:2021-10-10 12:54:08 【问题描述】:给定df
的列表,目标是以单页长格式保存所有df
。
每个df
都由 3 级列索引组成。对于每个df
,第一级是唯一的(“theme1”和“theme2”)。然而,所有 'df` 的第二级 ('level2) 和第三级 (A,B,C) 都是相似的。
在下面的代码sn-p中,
import pandas as pd
df1 = pd.DataFrame('A': [11, 21, 31],
'B': [12, 22, 32],
'C': [13, 23, 33],
index=['ONE', 'TWO', 'THREE'])
df2 = pd.DataFrame('A': [111, 211, 311],
'B': [121, 221, 321],
'C': [131, 231, 331],
index=['ONE', 'TWO', 'THREE'])
df1.columns = pd.MultiIndex.from_product([['theme1'],['level2'],df1.columns ])
df2.columns = pd.MultiIndex.from_product([['theme2'],['level2'],df2.columns ])
list_df=[df1,df2]
df_all=pd.concat(list_df,axis=1)
df_all.to_excel('df_all1.xlsx')
生成单页宽格式
但是,我想知道如何制作如下所示的单页长格式
附言长格式允许轻松的 excel 垂直滚动
【问题讨论】:
【参考方案1】:你可以这样做:
import pandas as pd
def multiple_dfs_to_same_excel_sheet(df_list, file_name, sheet_name, spaces):
writer = pd.ExcelWriter(file_name,engine='xlsxwriter')
row = 0
for dataframe in df_list:
dataframe.to_excel(writer,sheet_name=sheet_name,startrow=row , startcol=0)
row = row + len(dataframe.index) + spaces + 1
writer.save()
df1 = pd.DataFrame('A': [11, 21, 31],
'B': [12, 22, 32],
'C': [13, 23, 33],
index=['ONE', 'TWO', 'THREE'])
df2 = pd.DataFrame('A': [111, 211, 311],
'B': [121, 221, 321],
'C': [131, 231, 331],
index=['ONE', 'TWO', 'THREE'])
df1.columns = pd.MultiIndex.from_product([['theme1'],['level2'],df1.columns ])
df2.columns = pd.MultiIndex.from_product([['theme2'],['level2'],df2.columns ])
list_df=[df1,df2]
multiple_dfs_to_same_excel_sheet(list_df, 'excel_file.xlsx', 'sheet_01', 6)
我在开头添加了函数multiple_dfs_to_same_excel_sheet
的定义,在结尾添加了它的调用。
这个函数来自@TomDobbs (Putting many python pandas dataframes to one excel worksheet)。
注意:我将空格数设置为 6
,以便在表格之间有 3 行,如您的图像中所示。那是因为我们必须考虑第一行的数量(“Theme1”、“Level2”和“ABC”),所以这里是 3 个第一行(“Theme1”、“Level2”和“ABC”)加上 3 个空格.
【讨论】:
以上是关于以长格式保存具有不同级别名称的多索引列 Pandas 为 excel 格式的主要内容,如果未能解决你的问题,请参考以下文章