使用 MultiIndexing 修复导出到 Excel
Posted
技术标签:
【中文标题】使用 MultiIndexing 修复导出到 Excel【英文标题】:Fixing Exporting to Excel with MultiIndexing 【发布时间】:2015-08-02 10:40:56 【问题描述】:到目前为止,这是我的问题。我的 Pandas 版本是 0.15.2,我正在使用 Python 2.7。我正在尝试将具有 MultiIndexed 列的数据框导出到没有垂直索引的 excel 中。这完全概括了我的问题:
# imports
>>> import pandas as pd
>>> import numpy as np
# setting columns
>>> level_one = ['a']*3 + ['b']*3 + ['c']*3
>>> level_two = ['1', '2', '3']*3
>>> columns = [np.array(level_one), np.array(level_two)]
# making the dataframe
>>> df = pd.DataFrame(index=range(10), columns=columns)
>>> series = pd.Series(k:k**2 for k in range(10))
>>> df[first_col] = series
>>> first_col = df.columns.tolist()[0]
>>> df
a b c
1 2 3 1 2 3 1 2 3
0 0 NaN NaN NaN NaN NaN NaN NaN NaN
1 1 NaN NaN NaN NaN NaN NaN NaN NaN
2 4 NaN NaN NaN NaN NaN NaN NaN NaN
3 9 NaN NaN NaN NaN NaN NaN NaN NaN
4 16 NaN NaN NaN NaN NaN NaN NaN NaN
5 25 NaN NaN NaN NaN NaN NaN NaN NaN
6 36 NaN NaN NaN NaN NaN NaN NaN NaN
7 49 NaN NaN NaN NaN NaN NaN NaN NaN
8 64 NaN NaN NaN NaN NaN NaN NaN NaN
9 81 NaN NaN NaN NaN NaN NaN NaN NaN
所以,到目前为止一切正常。现在,当我导出到 csv 时,这两种方法都适用于数据完整性(没有相对于标题的数据移动,尽管它确实重复了 level_one 中的每个元素)。
>>> import os
>>> path = os.path.join(os.path.expanduser('~'), 'test.csv')
>>> df.to_csv(path)
>>> df.to_csv(path, index=False)
但是,对于 ExcelWriter,它执行以下操作:
>>> import os
>>> path = os.path.join(os.path.expanduser('~'), 'test.xlsx')
>>> writer = pd.ExcelWriter(path)
>>> df.to_excel(writer, 'Sheet 1')
>>> df.to_excel(writer, 'Sheet 2', index=False)
>>> writer.save()
With Index
Index False
如您所见,它消除了索引但不在列标题中,从而导致数据移位。有解决办法还是解决办法?在我的实际数据集中,实际的“索引”有重复的元素和间隔,所以不适合作为索引。
【问题讨论】:
还要补充一点:如果我有一个多索引索引和列,也会发生这种情况,但偏移量仍然只有一个。简而言之,尽管索引现在占用“n”列而不是 1,但输出完全相同。 我现在也尝试了所有 3 个引擎(XlsxWriter、OpenPyXl 和 Xlwt),并且所有 3 个引擎的错误都是完全相同的。我应该提交错误报告吗? 【参考方案1】:所以我在文档中找不到任何内容来解决这个问题,但我想出了一个临时修复方法。
import itertools
def pseudo_header(df):
'''Create a pseudo-header for the dataframe due to indexing
issues.
'''
# grab grouped columns
columns = df.columns
grouped = itertools.groupby(columns, key=lambda x: x[0])
grouped = [tuple(v) for k, v in grouped]
# grab col/index counters
index = DF.get_last_index(df)
counter = 0
# set rows
df.loc[index] = pd.Series(index=columns)
df.loc[index+1] = pd.Series(index=columns)
for group in grouped:
for idx, values in enumerate(group):
# grab indexing
column = columns[counter]
if idx == 0:
df.loc[index, column] = values[0]
df.loc[index+1, column] = values[1]
counter += 1
然后,我在关闭索引和标题的情况下导出。它有效,没有标题格式,但它不是一个糟糕的修复。
目前,仅适用于 2 级标题,我可以概括,但根据我的需要,现在没有必要。
【讨论】:
以上是关于使用 MultiIndexing 修复导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章