如何把多个 df 保存至一个 Excel?
2019-12-17 本文已影响0人
呆鸟的简书
Pandas 百问百答第 007 篇。
呆鸟云:“以前没注意这个问题,都是把单个 df 保存到单个 Excel 文件,前些日子有读者大大问到这个问题,先给出解决方案。大家可能知道怎么把多个 df 写入一个 Excel 文件的多个 sheet,但你们知道怎么把多个 df 分横向或纵向写入一个 Excel 文件的同一个 sheet 吗?不知道的话,就看文章吧。”
本篇解决两个问题:
- 把多个 df 分别写入到一个 Excel 文件的不同 sheet
- 把多个 df 写入一个 Excel 文件的同一个 sheet(分横向或纵向)
0. 创建三个 df
df1 = pd.DataFrame({
'a':[1,2],
'b':[3,4]
})
df2 = pd.DataFrame({
'c':[5,6],
'd':[7,8]
})
df3 = pd.DataFrame({
'e': [9, 10],
'f': [11, 12]
})
1. 把多个 df 分别写入到一个 Excel 文件的不同 sheet
with pd.ExcelWriter('data/output/multiple_dfs_to_one_excel.xlsx') as writer:
df1.to_excel(writer, 'df1')
df2.to_excel(writer, 'df2')
df3.to_excel(writer, 'df3')
注:这里提示一下,文件名写成相对路径,好处是,移动或分享文件时,不用再改路径。子目录的写法很多,反斜杠是一种比较简单的方式。
就这么简单,三个 df 都写到一个 Excel 文件里了,sheet 名分别为 df1 、 df2、df3,想换别的表名,更改 `.to_excel() 的表明参数就可以了。
2. 把多个 df 写入一个 Excel 文件的同一个 sheet(分横向或纵向)
把多个 df 放到一个 sheet 里有点复杂,呆鸟给需要的朋友编了一个现成的函数,比较简单,但是能用。
def to_onesheet(file_name=None, sheet_name=None, df_list=None, direction='h', spaces=1):
row = 0
col = 0
writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
for dataframe in df_list:
dataframe.to_excel(excel_writer=writer, sheet_name=sheet_name,
startrow=row, startcol=col)
if direction == 'h':
col = col + len(dataframe.columns) + spaces + 1
elif direction == 'v':
row = row + len(dataframe.index) + spaces + 1
else:
raise ValueError(
f"Direction must be 'h' or 'v', you entered is '{direction}'")
return writer.save()
简单说明一下这个函数:
1.file_name
,是输出文件名;
-
sheet_name
,是输出的表名; -
df_list
,是 df 的列表; -
direction
,是输出的方向,‘h’ 代表横向输出,‘v’ 代表纵向输出,输入其它参数,会提示错误,默认为横向; -
spaces
,代表每个 df 之间的空格,默认为 1 个空格。
有了这个函数以后,直接调用就可以了:
# 横向输出
to_onesheet('data/output/to_onsheet_h.xlsx', '横向测试',
df_list=dfs, direction='h', spaces=1)
# 或,纵向输出
to_onesheet('data/output/to_onsheet_v.xlsx', '纵向测试', dfs, 'v', 1)
输出效果比较简陋,如何优化,以后再说。