2016-11-26 35 views
0

我有大约2GB的数据,我想根据分析其他列的值创建一些新列。特别是我有以下代码可以在较小的数据集上正常工作,但在应用于2G(内存错误)时一直失败。使apply()函数的代码适用于2GB

是否有可能用另外一种代码代替这个代码,这样会更有效率,并且需要更少的RAM?

def calculate(row): 
    features = [111,222,333,444,555] 
    if row['C_1'] in features: 
     return 1 
    if row['C_2'] in features: 
     return 1 
    if row['C_3'] in features: 
     return 1 
    if row['C_4'] in features: 
     return 1 
    if row['C_5'] in features: 
     return 1 
    return 0 
result["NEW_COL"] = result.apply (lambda row: calculate(row),axis=1) 
+0

,而不是将使用较少的内存对整个文件编写代码,为什么不能在你的数据在读[大块,所以你不超过内存限制](https://pandas-docs.github.io/pandas-docs-travis/io.html#iterating-through-files-chunk-by-chunk)? –

+1

在2G声音的极限处发生崩溃,就像使用32位Python一样。如果您真的需要一次将所有数据存储在内存中,请尝试使用64位版本。但是,如上所述,通常更好地处理它大块 –

+0

应该是这样吗? '读者= pd.read_table( 'tmp.sv',九月= '|',CHUNKSIZE = 4) 用于读取器块:块[ “NEW_COL”] = chunk.apply(拉姆达行:计算(行),轴= 1)'那我怎么能把所有的东西都合并成一个新的'结果'? – duckertito

回答

1

除了在零部件加工,像下面这样可能更为有效:

features = (111, 222, 333, 444, 555) 
t = result.isin(features) 
result['NEW_COL'] = t['C_1'] | t['C_2'] | t['C_3'] | t['C_4'] | t['C_5'] 
相关问题