ValueError, преобразующий мульти-индексный фрейм данных панд в Excel - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь экспортировать мульти-индексный фрейм данных pandas в Excel без изменений индексов строк и меток столбцов. Я также хочу, чтобы строки индекса «Pool» в первом столбце были объединены, что, как я полагаю, должно делать 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

Что означает «Не удается преобразовать {0! R} в Excel» .format (значение)) в этом контексте?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Проблема в старой версии панд, для меня это хорошо работает в последней версии:

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

Так что, пожалуйста, обновите свою версию панд.

1 голос
/ 11 мая 2019

Я попробовал ваш код и получил правильный результат (я не смог воспроизвести вашу ошибку):

enter image description here

У меня 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 .

...