2017-06-23 114 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'。我在这里错过了什么? –