Панды: написание сводной таблицы со всеми ее столбцами, чтобы преуспеть

Я хочу написать сводную таблицу из pandas в лист excel, но я теряю информацию на уровне одной ячейки и не могу найти решение при просмотре веб-страниц.

Вот что я получил в сводной таблице, составленной из DataFrame:

T-Class     <00.5   <01.0
ZIP         
0   1375.0  762.0
1   2177.0  913.0

когда я пишу это, чтобы преуспеть, я теряю ячейку «T-класс» с соответствующей пустой строкой для «ZIP», это то, что я получаю, используя средство записи xlsx:

ZIP <00.5   <01.0
0   1375    762
1   2177    913

пример кода для записи в excel:

writer = pd.ExcelWriter('data.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='pivottable',header = True,index=True)
writer.save()

Как решить эту проблему?


person MBUser    schedule 26.04.2017    source источник
comment
T-Class — это имя объекта columns. to_excel не удосуживается записать имя объекта columns. Если вам нужен именно этот формат, вам нужно будет написать что-то на заказ. Полностью выполнимо, но не легко достижимо с помощью to_excel опций.   -  person piRSquared    schedule 26.04.2017
comment
Можете ли вы привести пример кода или подсказку, как сделать именно этот формат?   -  person MBUser    schedule 27.04.2017


Ответы (1)


Теперь, когда я вернулся к теме экспорта сводных таблиц для фреймов данных pandas, я нашел лучшую библиотеку для экспорта. Опенпиксл! С openpyxl можно открывать предопределенные шаблоны Excel, записывать данные вашего фрейма данных ниже предопределенной красивой таблицы, таким образом, нет необходимости иметь дело с ненужными ошибками xlsxwriter. Вот пример кода в openpyxl:

import openpyxl
from openpyxl import load_workbook
workbook.active = 0
worksheet = workbook.active
worksheet.title = 'XYZ'
#check length of df
depth_df_2 = len(merged_plz_all)
#call special method to comfortably write the dataframe below your
#predefined header
update_range(workbook.active,merged_plz_all,cell_range =
'A18:'+str(spaltenindex[len(merged_plz_all.columns)])+str(depth_df_2+17))
workbook.save('yourNicelyLookingPivotTable.xlsx')

И вот необходимый метод update_range, который я нашел в другом потоке stackoverflow. К сожалению, я не добавил его в закладки, поэтому прошу прощения за то, что не указал происхождение метода update_range. Лично я считаю, что этот метод должен быть частью самой библиотеки openpyxl!

def update_range(worksheet, data, cell_range=None, named_range=None):
"""
Updates an excel worksheet with the given data.
:param worksheet: an excel worksheet
:param data: data used to update the worksheet cell range (list, tuple, np.ndarray, pd.Dataframe)
:param cell_range: a string representing the cell range, e.g. 'AB12:XX23'
:param named_range: a string representing an excel named range
"""

def clean_data(data):
    if not isinstance(data, (list, tuple, np.ndarray, pd.DataFrame)):
        raise TypeError('Invalid data, data should be an array type iterable.')

    if not len(data):
        raise ValueError('You need to provide data to update the cells')

    if isinstance(data, pd.DataFrame):
        data = data.values

    elif isinstance(data, (list, tuple)):
        data = np.array(data)

    return np.hstack(data)

def clean_cells(worksheet, cell_range, named_range):
    # check that we can access a cell range
    if not any((cell_range, named_range) or all((cell_range, named_range))):
        raise ValueError('`cell_range` or `named_range` should be provided.')

    # get the cell range
    if cell_range:
        try:
            cells = np.hstack(worksheet[cell_range])
        except (CellCoordinatesException, AttributeError):
            raise ValueError('The cell range provided is invalid, cell range must be in the form XX--[:YY--]')

    else:
        try:
            cells = worksheet.get_named_range(named_range)
        except (TypeError):
            raise ValueError('The current worksheet {} does not contain any named range {}.'.format(
                worksheet.title,
                named_range))

    # checking that we have cells to update, and data
    if not len(cells):
        raise ValueError('You need to provide cells to update.')

    return cells

cells = clean_cells(worksheet, cell_range, named_range)
data = clean_data(data)

# check that the data has the same dimension as cells
if len(cells) != data.size:
    raise ValueError('Cells({}) should have the same dimension as the data({}).'.format(len(cells), data.size))

for i, cell in enumerate(cells):
    cell.value = data[i]
person MBUser    schedule 15.07.2017
comment
хотя это выглядит как хороший ответ, это ответ на совершенно другой вопрос. Оп спрашивал не об этом. - person Tuncay Göncüoğlu; 06.01.2020