Запись pandas DataFrame в Excel с разными форматами для разных столбцов

Я пытаюсь написать pandas DataFrame в файл .xlsx, где разные числовые столбцы будут иметь разные форматы. Например, некоторые отображали бы только два десятичных знака, некоторые не отображали бы ни одного, некоторые были бы отформатированы как проценты с символом «%» и т. д.

Я заметил, что DataFrame.to_html() имеет параметр formatters, который позволяет делать именно это, сопоставляя разные форматы с разными столбцами. Однако в методе DataFrame.to_excel() нет аналогичного параметра. Самое большее, что у нас есть, это float_format, глобальное для всех чисел.

Я прочитал много сообщений SO, которые хотя бы частично связаны с моим вопросом, например:

Существуют ли другие более удобные функции/свойства, связанные с Excel, в API pandas, которые могут помочь здесь, или что-то похожее на openpyxl, или, возможно, какой-то способ указать метаданные формата вывода непосредственно для каждого столбца в DataFrame, которые затем будут интерпретироваться нижестоящими различными выходы?


person sparc_spread    schedule 30.04.2015    source источник
comment
как насчет удаления ВСЕХ форматов? Кто-нибудь знает, есть ли быстрый способ сделать это?   -  person Lisle    schedule 19.01.2017


Ответы (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()

Выход:

введите здесь описание изображения

См. также Работа с Python Pandas и XlsxWriter.

person jmcnamara    schedule 01.05.2015

Как вы правильно заметили, применение форматов к отдельным ячейкам крайне неэффективно.

openpyxl 2.4 включает встроенную поддержку фреймов данных Pandas и именованных стилей.

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

person Charlie Clark    schedule 01.05.2015