Jam*_*mon 4 python multi-index pandas xlsxwriter
我正在尝试使用带有XlsxWriter的to_excel函数将Pandas数据帧保存到Excel文件中。
当我将数据帧打印到终端时,它会读取应有的内容,但是当我将其保存到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')
Run Code Online (Sandbox Code Playgroud)
小智 8
我还有一种解决方案。它基于在函数的两次调用中保存的想法to_excel - 第一次仅保存标题,第二次保存不带标题的表。为了实现我准备了这样的功能:
def save_double_column_df(df, xl_writer, startrow = 0, **kwargs):
'''Function to save doublecolumn DataFrame, to xlwriter'''
# inputs:
# df - pandas dataframe to save
# xl_writer - book for saving
# startrow - row from wich data frame will begins
# **kwargs - arguments of `to_excel` function of DataFrame`
df.drop(df.index).to_excel(xl_writer, startrow = startrow, **kwargs)
df.to_excel(xl_writer, startrow = startrow + 1, header = False, **kwargs)
Run Code Online (Sandbox Code Playgroud)
使用示例:
y = [('K1','l'),("K1",'m'),("K2",'l'),('K2','m'),("K3",'l'),('K3','m')]
col_list = pd.MultiIndex.from_tuples(y)
A = pd.DataFrame(np.random.randint(2,5,(4,6)), columns = col_list)
xl_writer = pd.ExcelWriter("test_result/multiindex_saving.xlsx",engine='xlsxwriter')
save_double_column_df(A, xl_writer, sheet_name = 'hello')
xl_writer.close()
Run Code Online (Sandbox Code Playgroud)
结果如下:
这很可能是熊猫中的一个错误。
请参阅此问题以获取建议的解决方案:
没有简单的方法可以解决这个问题,只能通过再次读取 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()
Run Code Online (Sandbox Code Playgroud)
非常感谢这个问题和@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()
Run Code Online (Sandbox Code Playgroud)