2016-09-22 78 views
1

我有一個數據幀df具有以下結構:熊貓數據幀樞軸 - 存儲器錯誤

 val   newidx Code 
Idx        
0  1.0  1220121127 706 
1  1.0  1220121030 706 
2  1.0  1620120122 565 

它具有百萬行。 總共我們有600個獨特的Code值和200000個獨特的newidx值。

如果我執行以下操作

df.pivot_table(values='val', index='newidx', columns='Code', aggfunc='max') 

我得到一個MemoryError。但這聽起來很奇怪,因爲生成的數據幀的大小應該是可持續的:200000x600。

有多少內存需要這樣的操作?有沒有辦法解決這個內存錯誤?看到

+0

您有1.2億個項目。 4個字段,我不確定,但我會說每行接近4Gb的32個字節。那麼你是否運行一個32位版本的Python或64位? –

+0

32位,在一臺4-GB的計算機上.. –

+0

它是真正低規格的問題,你有。如果答案不充分,就會出現一個令人討厭的解決方法。 –

回答

1

嘗試,如果這符合在你的記憶:

df.groupby(['newidx', 'Code'])['val'].max().unstack() 

pivot_table是不幸耗費巨大的內存,因爲它可能使數據的多個副本。


如果groupby不起作用,您將不得不將您的DataFrame拆分成更小的部分。儘量不要多次分配。例如,如果從csv讀取:

df = pd.read_csv('file.csv').groupby(['newidx', 'Code'])['val'].max().unstack() 

避免了多個分配。

+1

非常好的想法+1 – jezrael

0

我最近在執行4個數據框之間的合併時遇到了非常類似的問題。

我的工作是在groupby期間禁用索引,然後合併。

如果@Kartiks回答不起作用,請在分塊DataFrame之前嘗試執行此操作。

df.groupby(['newidx', 'Code'], as_index=False)['val'].max().unstack()