如何把多个 df 保存至一个 Excel?

呆鸟云:“以前没注意这个问题,都是把单个 df 保存到单个 Excel 文件,前些日子有读者大大问到这个问题,先给出解决方案。大家可能知道怎么把多个 df 写入一个 Excel 文件的多个 sheet,但你们知道怎么把多个 df 分横向或纵向写入一个 Excel 文件的同一个 sheet 吗?不知道的话,就看文章吧。”

本篇解决两个问题:

  1. 把多个 df 分别写入到一个 Excel 文件的不同 sheet

  2. 把多个 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,是输出文件名;

  2. sheet_name,是输出的表名;

  3. df_list,是 df 的列表;

  4. direction,是输出的方向,‘h’ 代表横向输出,‘v’ 代表纵向输出,输入其它参数,会提示错误,默认为横向;

  5. 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)

输出效果比较简陋,如何优化,以后再说。

好了,今天分享的Pandas 百问百答就到这里,如果对呆鸟的文章感兴趣,欢迎扫描以下群二维码,加入呆鸟、严小样儿、灰太狼的联合读者群,里面有各路大神指点迷津,名额有限不要错过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值