合并两个Pandas数据帧时的MemoryError

Ron*_*ara 23 python merge out-of-memory pandas

我搜索了几乎所有的互联网,不知何故,这些方法似乎都不适用于我的情况.

我有两个大的csv文件(每个文件有一百万+行,大小约为300-400MB).它们使用read_csv函数正确加载到数据框中,而不必使用chunksize参数.我甚至对这些数据进行了一些小的操作,比如新的列生成,过滤等.

但是,当我尝试合并这两个帧时,我得到一个MemoryError.我甚至尝试使用SQLite来完成合并,但是徒劳无功.这项行动需要永远.

我是一台装有8GB RAM的Windows 7 PC.Python版本是2.7

谢谢.

编辑:我也尝试过分块方法.当我这样做时,我没有得到MemoryError,但RAM使用爆炸,我的系统崩溃.

T_c*_*cat 21

当您使用pandas.merge合并数据时,它将使用df1内存,df2内存和merge_df内存.我相信这就是你得到内存错误的原因.您应该将df2导出到csv文件并使用chunksize选项并合并数据.

这可能是一种更好的方法,但你可以试试这个.*对于大型数据集,您可以在pandas.read_csv中使用chunksize选项

df1 = pd.read_csv("yourdata.csv")
df2 = pd.read_csv("yourdata2.csv")
df2_key = df2.Colname2

# creating a empty bucket to save result
df_result = pd.DataFrame(columns=(df1.columns.append(df2.columns)).unique())
df_result.to_csv("df3.csv",index_label=False)

# save data which only appear in df1 # sorry I was doing left join here. no need to run below two line.
# df_result = df1[df1.Colname1.isin(df2.Colname2)!=True]
# df_result.to_csv("df3.csv",index_label=False, mode="a")

# deleting df2 to save memory
del(df2)

def preprocess(x):
    df2=pd.merge(df1,x, left_on = "Colname1", right_on = "Colname2")
    df2.to_csv("df3.csv",mode="a",header=False,index=False)

reader = pd.read_csv("yourdata2.csv", chunksize=1000) # chunksize depends with you colsize

[preprocess(r) for r in reader]
Run Code Online (Sandbox Code Playgroud)

这将合并数据保存为df3.

  • 为什么这个分配 df2_key = df2.Colname2 (2认同)

use*_*459 6

您得到的原因MemoryError: Unable to allocate..可能是由于数据框中的重复项或空白。检查您要加入的列(使用合并时)并查看是否有重复项或空白。如果是这样,请使用以下命令删除它们:

df.drop_duplicates(subset ='column_name', keep = False, inplace = True) 
Run Code Online (Sandbox Code Playgroud)

然后重新运行您的 python/pandas 代码。这对我有用。