合并两个Pandas数据帧时的MemoryError

时间:2017-11-20 06:47:20

标签: python pandas merge out-of-memory

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

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

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

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

谢谢。

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

4 个答案:

答案 0 :(得分:13)

使用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]

这会将合并数据保存为df3。

答案 1 :(得分:2)

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

df.drop_duplicates(subset ='column_name', keep = False, inplace = True) 

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

答案 2 :(得分:0)

@T_cat建议的一般块版本效果很好。

但是,内存爆炸可能是由于联接具有Nan值的列而引起的。 因此,您可能要从联接中排除那些行。

请参阅:https://github.com/pandas-dev/pandas/issues/24698#issuecomment-614347153

答案 3 :(得分:-1)

也许左边的数据框在合并列中有 NaN,这会导致最终合并的数据框膨胀。

如果没问题,用零填充左侧数据框中的合并列。

df['left_column'] = df['left_column'].fillna(0)

然后进行合并。看看你得到了什么。