2014-03-27 34 views
3

由於某些編碼困難,我無法導出其中一個數據框。無法將熊貓數據框導出爲ex​​cel /編碼

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) 

我知道這個問題是從「客戶名稱」來柱,如刪除以後出口擅長工作正常。

我試着從以下這個問題(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?用於顯示我正確的方向使用

    步驟

@Jeff

感謝:

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

我得到同樣的問題,我它使用固定[從該溶液@eumiro] [1] [1]:http://stackoverflow.com/a/13682381/2797460 – billmanH

回答

2

安裝xlsxwriter(不與大熊貓捆綁),您需要使用熊貓> = 0.13,以及支持本地unicode寫入的excel的xlsxwriter引擎。 xlwt,默認引擎將支持傳遞編碼選項將在0.14中可用。

查看here的引擎文檔。

+1

感謝傑夫,那做到了 ! – knightofni

+0

有同樣的問題。用於反饋knightofni和@Jeff的Tx –