2017-06-23 180 views
1

片的大數據幀我有一個的大數據幀(> 3MM行),我試圖通過一個函數(下面的一個大大簡化),和我不斷收到一個Memory Error消息。大熊貓 - 在大塊

我想我路過太大的數據幀進入的功能,所以我想:

1)條中的數據框成小塊(最好AcctName切片)

2)通數據幀到函數

3)串聯的dataframes回一個的大數據幀

def trans_times_2(df): 
    df['Double_Transaction'] = df['Transaction'] * 2 

large_df 
AcctName Timestamp Transaction 
ABC  12/1   12.12 
ABC  12/2   20.89 
ABC  12/3   51.93  
DEF  12/2   13.12 
DEF  12/8   9.93 
DEF  12/9   92.09 
GHI  12/1   14.33 
GHI  12/6   21.99 
GHI  12/12  98.81 

我知道我的功能的正常使用,因爲它會在一個較小的數據框的工作(例如40,000行)。我嘗試了以下方法,但是我沒有成功將小數據框連接回一個大型數據框。

def split_df(df): 
    new_df = [] 
    AcctNames = df.AcctName.unique() 
    DataFrameDict = {elem: pd.DataFrame for elem in AcctNames} 
    key_list = [k for k in DataFrameDict.keys()] 
    new_df = [] 
    for key in DataFrameDict.keys(): 
     DataFrameDict[key] = df[:][df.AcctNames == key] 
     trans_times_2(DataFrameDict[key]) 
    rejoined_df = pd.concat(new_df) 

如何我想象的dataframes被拆分:

df1 
AcctName Timestamp Transaction Double_Transaction 
ABC  12/1   12.12  24.24 
ABC  12/2   20.89  41.78 
ABC  12/3   51.93  103.86 

df2 
AcctName Timestamp Transaction Double_Transaction 
DEF  12/2   13.12  26.24 
DEF  12/8   9.93  19.86 
DEF  12/9   92.09  184.18 

df3 
AcctName Timestamp Transaction Double_Transaction 
GHI  12/1   14.33  28.66 
GHI  12/6   21.99  43.98 
GHI  12/12  98.81  197.62 

回答

6

您可以使用列表中理解到你的數據幀分成包含在列表較小dataframes。

n = 200000 #chunk row size 
list_df = [df[i:i+n] for i in range(0,df.shape[0],n)] 

您可以通過訪問大塊:

list_df[0] 
list_df[1] 
etc... 

然後你就可以組裝它放回一個數據幀使用pd.concat。

通過AcctName

list_df = [] 

for n,g in df.groupby('AcctName'): 
    list_df.append(g) 
+0

感謝斯科特!有沒有辦法根據'AcctName'而不是塊大小拆分成更小的數據框? –

+0

@WaltReed嘗試使用groupby的第二部分。 –

+0

好吧,太棒了,工作!我在函數內部調用這個,但是當我嘗試查看新的數據幀* *後運行的功能,我得到的錯誤'NameError:名字「new_df」不是defined'。我在這裏錯過了什麼? –