ValueError 将多索引熊猫数据框转换为 Excel

Posted

技术标签:

【中文标题】ValueError 将多索引熊猫数据框转换为 Excel【英文标题】:ValueError converting multi-index pandas dataframe to Excel 【发布时间】:2019-09-28 22:14:48 【问题描述】:

我正在尝试将多索引 pandas 数据框导出到 Excel,其中行索引和列标签完好无损。我还希望合并第一列中的“池”索引行,我相信 pd.to_excel 应该这样做。

我也尝试过 openpyxl,但如果没有 ValueError,它似乎无法正常工作。我还尝试了 df=df.reset_index() 只是想看看我是否可以获得一个显示所有索引和列标签的平面文件,但这没有用。下面是代码和结果:

Python 3.6.0 (v3.6.0:41df79263a11, Dec 22 2016, 17:23:13) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> import numpy as np
>>> import math
>>> s1arrays = [np.array(['Pool1', 'Pool1', 'Pool2', 'Pool2']),
...             np.array(['Rate1', 'Rate2', 'Rate1', 'Rate2'])]
>>> tuples = list(zip(*s1arrays))
>>> index = pd.MultiIndex.from_tuples(tuples, names=['Pool', 'Rate'])
>>> df = pd.DataFrame(np.random.randn(4, 3), columns=[2019, 2020, 2021], index=index)
>>> print(df)
                 2019      2020      2021
Pool  Rate                               
Pool1 Rate1  0.564911 -0.883633 -0.333450
      Rate2 -1.043308  1.543050  1.342350
Pool2 Rate1 -0.838110  2.287242 -1.285863
      Rate2  0.076783 -1.074720  0.801417
>>> df.to_excel('Test Output.xlsx', sheet_name='Sheet1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/core/generic.py", line 2127, in to_excel
    engine=engine)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/formats/excel.py", line 662, in write
    freeze_panes=freeze_panes)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pandas/io/excel.py", line 1605, in write_cells
    xcell.value, fmt = self._value_with_fmt(cell.val)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/cell/cell.py", line 252, in value
    self._bind_value(value)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/openpyxl/cell/cell.py", line 218, in _bind_value
    raise ValueError("Cannot convert 0!r to Excel".format(value))
ValueError: Cannot convert 'Pool1' to Excel

"Cannot convert 0!r to Excel".format(value)) 在这种情况下是什么意思?

【问题讨论】:

你的熊猫版本是什么?对我来说,在 pandas 0.24.2,openpyxl:2.4.10,xlrd:1.1.0,xlwt:1.3.0,xlsxwriter:1.0.2 工作得很好。通过print (pd.show_versions())进行测试 熊猫:0.24.2,openpyxl:2.6.2,xlrd:1.2.0,xlwt:无,xlsxwriter:无。果然,这就是问题所在!我必须单独安装 xlwt 和 xlsxwriter。我认为这些软件包将与熊猫一起安装。谢谢! 超级,已创建答案。 【参考方案1】:

问题出在旧版本的 pandas 中,对我来说它在上一个版本中运行良好:

pandas 0.24.2
openpyxl: 2.4.10
xlrd: 1.1.0
xlwt: 1.3.0
xlsxwriter: 1.0.2 

所以请升级你的 pandas 版本。

【讨论】:

【参考方案2】:

我尝试了您的代码并得到了正确的结果(我无法复制您的错误):

我有 Python v. 3.7.0、Pandas v. 0.23.4 和 Jupyter v. 1.0.0。 也许你应该升级你的安装?

顺便说一句:您可以将s1arrays 定义为:

s1arrays = [['Pool1', 'Pool1', 'Pool2', 'Pool2'],
            ['Rate1', 'Rate2', 'Rate1', 'Rate2']]

另一个说明是文件名中的空格是不好的做法。更改 文件名,例如Test_Output.xlsx

【讨论】:

以上是关于ValueError 将多索引熊猫数据框转换为 Excel的主要内容,如果未能解决你的问题,请参考以下文章

按对象将熊猫分组转换为多索引数据框

如何将多索引列转换为熊猫数据框的单索引列?

将熊猫多索引数据框重塑为多列

将列添加到熊猫数据框以进行多索引

3维numpy数组到多索引熊猫数据框

熊猫将第一个多索引转换为行索引,将第二个多索引转换为列索引