【问题标题】:Writing pandas DataFrame to Excel with different formats for different columns将 pandas DataFrame 写入 Excel,为不同的列使用不同的格式
【发布时间】:2015-07-10 13:33:55
【问题描述】:

我正在尝试将 pandas DataFrame 写入 .xlsx 文件,其中不同的数字列将具有不同的格式。例如,有些只显示两位小数,有些不显示,有些会格式化为带有“%”符号的百分比等。

我注意到DataFrame.to_html() 有一个formatters 参数,它允许这样做,将不同的格式映射到不同的列。但是,DataFrame.to_excel() 方法上没有类似的参数。我们拥有的最多的是float_format,它对所有数字都是全局的。

我已经阅读了许多至少与我的问题部分相关的 SO 帖子,例如:

pandas API 中是否还有其他更方便的与 Excel 相关的函数/属性可以在这里提供帮助,或者在 openpyxl 上提供类似的东西,或者可能以某种方式将输出格式元数据直接指定到 DataFrame 中的每一列上然后会被不同的输出器向下游解释吗?

【问题讨论】:

  • 删除所有格式怎么样?有谁知道有没有快速的方法?

标签: python excel pandas openpyxl


【解决方案1】:

正如您正确指出的那样,将格式应用于单个单元格效率极低。

openpyxl 2.4 包括对 Pandas 数据框和命名样式的原生支持。

https://openpyxl.readthedocs.io/en/latest/changes.html#id7

【讨论】:

    【解决方案2】:

    您可以使用 Pandas 0.16 和 XlsxWriter 引擎通过访问底层工作簿和工作表对象来做到这一点:

    import pandas as pd
    
    # Create a Pandas dataframe from some data.
    df = pd.DataFrame(zip(
        [1010, 2020, 3030, 2020, 1515, 3030, 4545],
        [.1, .2, .33, .25, .5, .75, .45],
        [.1, .2, .33, .25, .5, .75, .45],
    ))
    
    # Create a Pandas Excel writer using XlsxWriter as the engine.
    writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
    df.to_excel(writer, sheet_name='Sheet1')
    
    # Get the xlsxwriter objects from the dataframe writer object.
    workbook  = writer.book
    worksheet = writer.sheets['Sheet1']
    
    # Add some cell formats.
    format1 = workbook.add_format({'num_format': '#,##0.00'})
    format2 = workbook.add_format({'num_format': '0%'})
    format3 = workbook.add_format({'num_format': 'h:mm:ss AM/PM'})
    
    # Set the column width and format.
    worksheet.set_column('B:B', 18, format1)
    
    # Set the format but not the column width.
    worksheet.set_column('C:C', None, format2)
    
    worksheet.set_column('D:D', 16, format3)
    
    # Close the Pandas Excel writer and output the Excel file.
    writer.save()
    

    输出:

    另见Working with Python Pandas and XlsxWriter。

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 2021-01-28
      • 2017-12-22
      • 2018-01-16
      • 2018-08-13
      • 2021-11-22
      • 2021-12-01
      • 2018-07-05
      • 2020-04-17
      相关资源
      最近更新 更多