Я пытаюсь сохранить файл данных Pandas в файл excel, используя функцию to_excel с XlsxWriter.
Когда я печатаю dataframe на терминал, тогда он читается так, как должен, но когда я сохраняю его, чтобы преуспеть и открывать файл, над заголовками должна быть дополнительная пустая строка, которой не должно быть. Это происходит только при использовании 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 создан:
Скорее всего, это ошибка в пандах.
См. Этот вопрос для предлагаемого решения:
Нелегкий выход из этого, но удалить эту строку, снова прочитав 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()
Это выходной файл:
Очень ценю как вопрос, так и обход @Teoretic.
Однако в моем случае объединенные ячейки для столбцов Multiindex
очень полезны, и они теряются с @Teoretic's. Я сделал альтернативный обходной путь, скрывая всю строку перед записью, она работает, поэтому я включаю ее здесь на случай, если это пригодится кому-либо.
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()
xlsx
. Не нашел выхода, но это не идеальный обходной путь :)