Пустая строка под заголовками, созданными при использовании MultiIndex и to_excel в Python - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь сохранить фрейм данных Pandas в файл Excel, используя функцию to_excel с XlsxWriter.

Когда я печатаю фрейм данных в терминал, он читается так, как должен, но когда я сохраняю его в Excelи откройте файл, есть дополнительная пустая строка под заголовками, которых там быть не должно.Это происходит только при использовании MultiIndex для заголовков, но мне нужны многоуровневые заголовки, которые он предлагает, и я не могу найти решение.

Ниже приведен код из онлайн-примера MultiIndex, который дает тот же результат, что и проектЯ работаю на.Любые решения будут с благодарностью.

import numpy as np
import pandas as pd
import xlsxwriter

tuples = [('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two'), ('foo', 'one'), ('foo', 'two'), ('qux', 'one'), ('qux', 'two')]

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])

iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']]

pd.MultiIndex.from_product(iterables, names=['first', 'second'])

df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)

print(df)

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1')

Создан выход Excel: enter image description here

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Действительно ценю и вопрос, и обходной путь @ Teoretic.

Однако в моем случае объединенные ячейки для столбцов Multiindex очень полезны, и они теряются при использовании @ Teoretic.Я сделал альтернативный обходной путь, скрывая всю строку перед записью, она работает, поэтому я включаю ее здесь на случай, если это пригодится кому-либо.

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1')
writer.sheets['test1'].set_row(2, None, None, {'hidden': True})
writer.save()
0 голосов
/ 25 сентября 2018

Скорее всего, это ошибка в пандах.

См. этот вопрос для предлагаемого решения:

Нет простого выходаоб этом, но удалить эту строку, снова прочитав xlsx.

Также есть ссылка на проблему GitHub , посвященную этой теме.

Итак, я сделал этот обходной путь, он может быть полезен для вас:

df = pd.read_excel('/home/teoretic/test.xlsx', index_col=0)
df = df.drop(np.nan)  # <== dropping an empty row

rename_dct = dict.fromkeys(df.loc[:,df.columns.str.contains('^Unnamed')], '')
df = df.rename(columns=rename_dct)  # <== renaming 'Unnamed' columns to blank space 

writer = pd.ExcelWriter('/home/teoretic/test_new.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='test1')

writer.close()

Это выходной файл: enter image description here

...