【问题标题】:Can't export pandas dataframe to excel / encoding无法将熊猫数据框导出到 excel / 编码
【发布时间】:2014-05-06 01:44:04
【问题描述】:

由于编码困难,我无法导出其中一个数据帧。

sjM.dtypes

Customer Name              object
Total Sales               float64
Sales Rank                float64
Visit_Frequency           float64
Last_Sale          datetime64[ns]
dtype: object

csv 导出工作正常

path = 'c:\\test'
sjM.to_csv(path + '.csv')   # Works

但是excel导出失败

sjM.to_excel(path + '.xls')

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "testing.py", line 338, in <module>
    sjM.to_excel(path + '.xls')
  File "c:\Anaconda\Lib\site-packages\pandas\core\frame.py", line 1197, in to_excel
    excel_writer.save()
  File "c:\Anaconda\Lib\site-packages\pandas\io\excel.py", line 595, in save
    return self.book.save(self.path)
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 662, in save
    doc.save(filename, self.get_biff_data())
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 637, in get_biff_data
    shared_str_table   = self.__sst_rec()
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 599, in __sst_rec
    return self.__sst.get_biff_record()
  File "c:\Anaconda\Lib\site-packages\xlwt\BIFFRecords.py", line 76, in get_biff_record
    self._add_to_sst(s)
  File "c:\Anaconda\Lib\site-packages\xlwt\BIFFRecords.py", line 91, in _add_to_sst
    u_str = upack2(s, self.encoding)
  File "c:\Anaconda\Lib\site-packages\xlwt\UnicodeUtils.py", line 50, in upack2
    us = unicode(s, encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x81 in position 22: ordinal not in range(128)

我知道问题出在“客户名称”列,因为删除后导出到 excel 工作正常。

我已尝试遵循该问题 (Python pandas to_excel 'utf8' codec can't decode byte) 的建议,使用函数对有问题的列进行解码和重新编码

def changeencode(data):
    cols = data.columns
    for col in cols:
        if data[col].dtype == 'O':
            data[col] = data[col].str.decode('latin-1').str.encode('utf-8')
    return data

sJM = changeencode(sjM)

sjM['Customer Name'].str.decode('utf-8')

L2-00864                         SETIA 2
K1-00279                     BERKAT JAYA
L2-00664                        TK. ANTO
BR00035                   BRASIL JAYA,TK
RA00011               CV. RAHAYU SENTOSA

所以转换为 unicode 似乎是成功的

sjM.to_excel(path + '.xls')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\Anaconda\Lib\site-packages\pandas\core\frame.py", line 1197, in to_excel
    excel_writer.save()
  File "c:\Anaconda\Lib\site-packages\pandas\io\excel.py", line 595, in save
    return self.book.save(self.path)
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 662, in save
    doc.save(filename, self.get_biff_data())
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 637, in get_biff_data
    shared_str_table   = self.__sst_rec()
  File "c:\Anaconda\Lib\site-packages\xlwt\Workbook.py", line 599, in __sst_rec
    return self.__sst.get_biff_record()
  File "c:\Anaconda\Lib\site-packages\xlwt\BIFFRecords.py", line 76, in get_biff_record
    self._add_to_sst(s)
  File "c:\Anaconda\Lib\site-packages\xlwt\BIFFRecords.py", line 91, in _add_to_sst
    u_str = upack2(s, self.encoding)
  File "c:\Anaconda\Lib\site-packages\xlwt\UnicodeUtils.py", line 50, in upack2
    us = unicode(s, encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 22: ordinal not in range(128)
  1. 为什么它会失败,即使转换为 unicode 似乎是成功的?
  2. 如何解决此问题以将该数据框导出到 Excel 中?

@杰夫

谢谢你告诉我正确的方向

使用的步骤:

安装 xlsxwriter(不与 pandas 捆绑)

sjM.to_excel(path + '.xlsx', sheet_name='Sheet1', engine='xlsxwriter')

【问题讨论】:

标签: python pandas xlwt


【解决方案1】:

您需要使用pandas >= 0.13 和xlsxwriter 的excel 引擎,它支持原生的unicode 编写。 xlwt,默认引擎将支持传递编码选项,将在 0.14 中提供。

有关引擎文档,请参阅 here

【讨论】:

  • 谢谢杰夫,成功了!
  • 遇到了同样的问题。用于反馈 knightofni 和 @Jeff 的 Txs
猜你喜欢
  • 2020-12-03
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2015-06-10
  • 2020-12-14
  • 2022-07-20
相关资源
最近更新 更多