使用不同列的不同格式将 pandas DataFrame 写入 Excel
Writing pandas DataFrame to Excel with different formats for different columns
我正在尝试将 pandas DataFrame
写入 .xlsx
文件,其中不同的数字列将具有不同的格式。例如,有些只显示两位小数,有些会显示 none,有些会格式化为带“%”符号的百分比,等等。
我注意到 DataFrame.to_html()
有一个 formatters
参数,允许人们这样做,将不同的格式映射到不同的列。但是,DataFrame.to_excel()
方法上没有类似的参数。我们最多的是 float_format
对所有数字都是全局的。
我已经阅读了许多至少与我的问题部分相关的 SO 帖子,例如:
- Use the older
openpyxl
engine to apply formats one cell at a time。这是我取得最大成功的方法。但这意味着编写循环以逐个单元格地应用格式、记住偏移量等。
- Render percentages by changing the table data itself into strings。改变实际数据的路线启发我尝试通过在写入 Excel 之前在每一列上调用
round()
来处理小数位格式 - 这也有效,但我想避免改变数据.
- 其他各种,主要是关于日期格式
在 pandas API 中是否有其他更方便的 Excel 相关 functions/properties 可以在这里提供帮助,或者 openpyxl
上的类似内容,或者也许可以通过某种方式将输出格式元数据直接指定到 DataFrame
中的每一列,然后由不同的输出器在下游解释?
您可以使用 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()
输出:
正如您正确指出的那样,将格式应用于单个单元格效率极低。
openpyxl 2.4 包括对 Pandas 数据框和命名样式的原生支持。
我正在尝试将 pandas DataFrame
写入 .xlsx
文件,其中不同的数字列将具有不同的格式。例如,有些只显示两位小数,有些会显示 none,有些会格式化为带“%”符号的百分比,等等。
我注意到 DataFrame.to_html()
有一个 formatters
参数,允许人们这样做,将不同的格式映射到不同的列。但是,DataFrame.to_excel()
方法上没有类似的参数。我们最多的是 float_format
对所有数字都是全局的。
我已经阅读了许多至少与我的问题部分相关的 SO 帖子,例如:
- Use the older
openpyxl
engine to apply formats one cell at a time。这是我取得最大成功的方法。但这意味着编写循环以逐个单元格地应用格式、记住偏移量等。 - Render percentages by changing the table data itself into strings。改变实际数据的路线启发我尝试通过在写入 Excel 之前在每一列上调用
round()
来处理小数位格式 - 这也有效,但我想避免改变数据. - 其他各种,主要是关于日期格式
在 pandas API 中是否有其他更方便的 Excel 相关 functions/properties 可以在这里提供帮助,或者 openpyxl
上的类似内容,或者也许可以通过某种方式将输出格式元数据直接指定到 DataFrame
中的每一列,然后由不同的输出器在下游解释?
您可以使用 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()
输出:
正如您正确指出的那样,将格式应用于单个单元格效率极低。
openpyxl 2.4 包括对 Pandas 数据框和命名样式的原生支持。