2014-12-18 24 views
2

我正在熊貓寫一些數據分析管道。我一直在使用的數據框中的一列是由自定義編寫的類組成的對象,每個類都用一個字符串初始化,從中讀取各種具有正則表達式的信息並存儲在對象的屬性中。子類的結構類似於人們如何實現生命之樹(例如,Tiger是貓的一個子類,它是動物的一個子類,並且經常 - 但不總是 - 具有相同超類的動物將共享方法)。它還有一些可用於計算的有用方法。對於海峽再版方法返回用於初始化它,像這樣的字符串:製作自定義類xlsxwriter友好

class Animal(object): 

    def __init__(self, name): 
     self.name = name 
     self.group = self.__class__.__name__ 

    def __repr__(self): 
     return self.name.__repr__() 

    def __str__(self): 
     return self.name.__str__() 

我使用這段代碼寫入數據幀到Excel電子表格的字典:

 with pd.ExcelWriter(saveas) as writer: 
      for key, val in dictionary.items(): 
       print key 
       write_index = not val.data_frame.index.is_integer() 
       val.to_excel(writer, sheet_name=key, index=write_index) 
      writer.save() 

這意味着當我想查看我的數據框時,我看到一個字符串。我已經使用上,在他們擁有這些對象的數據幀的to_csv()方法沒有問題,但是當我用熊貓數據幀的to_excel()方法中,我得到以下錯誤:

File "C:\Users\Mike\Anaconda\lib\site-packages\xlsxwriter\worksheet.py", line 406, in write 
    f = float(token) 

TypeError: float() argument must be a string or a number 

所以我在worksheet.py跟蹤下來的代碼,違規線條看起來是這樣的:

try: 
     f = float(token) ##THIS IS WHERE THE CODE FAILS 
     if not self._isnan(f) and not self._isinf(f): 
      return self.write_number(row, col, f, *args[1:]) 
    except ValueError: 
     pass 

    # Finally try string. 
    try: 
     str(token) 
     return self.write_string(row, col, *args) 
    except ValueError: 
     raise TypeError("Unsupported type %s in write()" % type(token)) 

我已經添加到上面的代碼中的註釋,以顯示該失敗發生。我的對象沒有float方法,所以不是ValueError而是拋出TypeErrors。從上面的代碼中可以清楚的看出,如果我們可以通過第二次嘗試的話,寫作將開始(因爲我的課程有一個方法str方法)。所以我給了我的自定義類float方法,該方法返回一個ValueError,以便可以觸發except子句。

然而,使用xlsx編寫器存在更多的問題,其中一些類似的問題涉及我的類中缺少某些方法(我在每種情況下都添加了這些方法)。然而,這只是延緩問題:

File "C:\Users\Mike\Anaconda\lib\site-packages\xlsxwriter\sharedstrings.py", line 95, in _write_si 
    string = re.sub('(_x[0-9a-fA-F]{4}_)', r'_x005F\1', string) 

現在,這裏(我看了一下代碼)的問題,一旦串已經寫入表,xlsxwriter運行某些功能得到所有字符串來自書面文件。這個問題似乎是,一旦表單被寫入了(write.save()的所有內容都會正確傳遞),xlsxwriter會假定寫入的字符串始終是字符串,並將它們視爲它,而不是將它們封裝在str()函數就像以前一樣。

現在,我可以去修改有問題的代碼,但我不想處理使用xlsxwriter進行更新的問題。我可以簡單地讓我的類從str繼承,但是這看起來像unpythonic,因爲我不想使用幾乎任何字符串方法。最後,我可以通過將這個子類中的所有東西都變成一個字符串來清理數據框,但這意味着我必須重寫很多我使用的東西,這取決於能夠使用DataFrame.to_excel方法。我能在課堂上做些什麼,使我不必繼承str的所有內容?

+0

,嘗試使用'%debug'來查看有問題的'token'是什麼。 –

+1

違規令牌是我在帖子中討論的類中的一員。 – MTrenfield

+0

你確定*這是什麼標記,看起來像浮動(令牌)不會提高,如果是這種情況... –

回答

3

最簡單的方法可能是,如果你使用IPython的只是實現自己的引擎使用

from pandas import io 
class MyXLSWriter(io.excel.xlsx.writer): 
    def write_cells(self, cells,*args,**kwargs): 
     for cell in cells: 
      if isinstance(cell.val,(MyCustomClass1,MyCustomClassN)): 
       cell.val = str(cell.val) #or some other representaion... 
     io.excel.xlsx.writer.write_cells(self,cells,*args,**kwargs) 

my_df.to_excell(fname,engine=MyXLSWriter) 

我覺得至少......我完全沒有測試它...

+0

也許我沒有清楚地說出我的問題。我已經這樣做了。 – MTrenfield

+0

是的,我看到後... –

+0

啊,好的。沒問題。我認爲,如果他們讓我(這將是我的第一個開源貢獻!),我可能會把它帶給工作在xlsxwriter上的人,甚至可能自己工作。看起來像這樣的東西應該沒有錯誤地通過。 – MTrenfield