2013-10-08 56 views
0

我想保存我使用group_ex函數創建使用groupby到excel文件的數據框。當我在ipython筆記本中預覽數據時,它會根據需要顯示。的GROUPBY代碼很簡單:熊貓:與使用分組數據幀的to_excel的問題

grouped = teach_freq.groupby(['Focal','follow','Activity']) 
    grouped.head() 

    <class 'pandas.core.frame.DataFrame'> 
    MultiIndex: 1797 entries, (10107.0, 192.0, ff, 25220.0) to (53704.0, 142.0, ss.rn, 18823.0) 
    Data columns (total 16 columns): 
    Epoch   1790 non-null values 
    follow  1797 non-null values 
    T_Opp   1797 non-null values 
    T_Dir   1797 non-null values 
    T_Enh   1797 non-null values 
    T_SocTol  1797 non-null values 

...等等 dtypes:float64(3),Int64的(6),對象(7)

的to_excel代碼也簡單:

grouped.to_excel('filename.xls', sheet_name='sheet1') 

當我運行這最後一個代碼時,只有幾行數據會將它傳送到excel文件中(大約1800行數據中有大約3個),我在ipython筆記本中預覽了另一部分數據,像這樣:

Focal follow Activity  
    10107 192  ff    None 
    10212 187  rn.ss   None 
    194   hc    None 
        pa    None 
    10213 166  hr.hg   None 
        pa    None 
        sr.hg   None 
        sr.hl   None 

這些數據看起來只是我分組的3列,再加上一列None,這在我的數據框中不存在。在該文件中,我獲得了6行正確格式化的數據,標題和全部。如果我密切關注Finder中正在寫入的文件,其大小會隨着to_excel代碼行的變化而變化,我認爲這一行代碼一次只能向文件寫入小塊數據,寫下每一個。

最終文件大小很小(6KB),但是在代碼運行時的某些時間點,文件大小較大(最大爲32KB)。

最後,在ipython數據中顯示的最後幾行數據看起來就是在那些成功寫入excel文件之前的行,這表明由於某種原因,它只保存那些數據行超過ipython筆記本預覽限制。我不確定爲什麼有人會希望將其作爲功能,或者爲什麼它會以這種方式運行。

這是奇怪的,我希望有人可以向我解釋爲什麼會發生這種情況。我查看了groupby和to_excel文檔,並瀏覽了任何有類似問題的人,但還沒有找到它。我用這個相同的數據來處理數據幀,沒有分組,也沒有任何類似的問題。我其實並沒有清楚爲什麼我會在筆記本中獲得輸出,就像我用過的其他時間段一樣,我只能看到excel文件本身的輸出。

+0

你說「將我使用groupby創建的數據框保存到excel文件中」,但我在代碼中看不到它。 'groupby'不返回一個'DataFrame',它返回一個'DataFrameGroupBy'對象,我懷疑是這個問題。爲了確定,有沒有你遺漏的代碼? – DSM

+0

不,我沒有遺漏代碼 - 只是犯了愚蠢的初學者錯誤。 –

+4

幾乎從定義上講,初學者不能犯愚蠢的錯誤:他們是初學者。需要經驗才能犯下愚蠢的錯誤,其中積累的是專業知識。 ; ^) – DSM

回答

3

看到完整的文檔here

問題是你正嘗試將DataFrameGroupby對象,這使得底層數據框一些行動上運行。不過你需要東西給groupby對象來創建一個新的數據框。

to_excel不應該工作(事實上在即將到來的0.13版本將被禁用)。

In [1]: df = DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]}) 

In [2]: df 
Out[2]: 
    X Y 
0 B 1 
1 B 2 
2 A 3 
3 A 4 

In [3]: df.groupby('X') 
Out[3]: <pandas.core.groupby.DataFrameGroupBy object at 0x40523d0> 

In [4]: df.groupby('X').sum() 
Out[4]: 
    Y 
X 
A 7 
B 3 

In [5]: type(df.groupby('X').sum()) 
Out[5]: pandas.core.frame.DataFrame 

所以,你需要申請聚集操作(例如sum,或使用apply)到您的組合框,然後將創建一個新的框架,它可以to_excel

+1

這是有道理的。我想我應該使用代碼,如果我想按輸出組來組織排序,但不應用任何聚合操作。感謝您的明確解釋 - 事實上,一些輸出確實使它成爲excel文件,這讓我認爲它應該按照我的設想工作,但顯然不是。 –

+0

是的....如果你真的想組(excel以外),那麼你應該聚合,否則,排序是一個很好的折衷 – Jeff

0

這只是一個部分答案,但我發現如果使用以下代碼,to_excel函數可以正常工作。但這似乎與典型的to_excel用法不一致,所以我仍然希望有人能向我解釋這一點。

grouped.head().to_excel('PREVIEW.xls') 

它似乎並不是這是一個永久的解決方案,因爲head()不會顯示大文件上的所有數據。在這裏,我實際上對它爲什麼這樣做有點困惑。但它有用,所以我會和它一起去,希望有人能夠引用我正確的文檔,以便我能理解爲什麼會這樣。