合并两个 Pandas 数据帧时出现 MemoryError
MemoryError when I merge two Pandas data frames
我几乎在整个互联网上进行了搜索,不知何故 none 的方法似乎对我有用。
我有两个大型 csv 文件(每个文件有一百万行以上,大小约为 300-400MB)。他们使用 read_csv 函数可以很好地加载到数据帧中,而无需使用 chunksize 参数。
我什至对这些数据执行了一些小操作,如新列生成、过滤等。
但是,当我尝试合并这两个帧时,出现 MemoryError。我什至尝试过使用 SQLite 来完成合并,但没有成功。手术需要很长时间。
我的是 Windows 7 PC,内存为 8GB。 Python 版本为 2.7
谢谢。
编辑:我也尝试过分块方法。当我这样做时,我没有收到 MemoryError,但 RAM 使用量激增并且我的系统崩溃了。
当您使用 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。
@T_cat 建议的一般块版本效果很好。
但是,内存爆炸可能是由连接具有 Nan
值的列引起的。
因此,您可能希望从连接中排除这些行。
参见:https://github.com/pandas-dev/pandas/issues/24698#issuecomment-614347153
您可能得到 MemoryError: Unable to allocate..
的原因可能是由于数据框中的重复项或空白。检查您要加入的列(使用合并时),看看是否有重复项或空白。如果是这样,请使用此命令摆脱它们:
df.drop_duplicates(subset ='column_name', keep = False, inplace = True)
然后重新运行你的python/pandas代码。这对我有用。
可能左侧数据框的合并列中有 NaN,导致最终合并后的数据框膨胀。
如果可以,用零填充左侧数据框中的合并列。
df['left_column'] = df['left_column'].fillna(0)
然后进行合并。看看你得到了什么。
我几乎在整个互联网上进行了搜索,不知何故 none 的方法似乎对我有用。
我有两个大型 csv 文件(每个文件有一百万行以上,大小约为 300-400MB)。他们使用 read_csv 函数可以很好地加载到数据帧中,而无需使用 chunksize 参数。 我什至对这些数据执行了一些小操作,如新列生成、过滤等。
但是,当我尝试合并这两个帧时,出现 MemoryError。我什至尝试过使用 SQLite 来完成合并,但没有成功。手术需要很长时间。
我的是 Windows 7 PC,内存为 8GB。 Python 版本为 2.7
谢谢。
编辑:我也尝试过分块方法。当我这样做时,我没有收到 MemoryError,但 RAM 使用量激增并且我的系统崩溃了。
当您使用 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。
@T_cat 建议的一般块版本效果很好。
但是,内存爆炸可能是由连接具有 Nan
值的列引起的。
因此,您可能希望从连接中排除这些行。
参见:https://github.com/pandas-dev/pandas/issues/24698#issuecomment-614347153
您可能得到 MemoryError: Unable to allocate..
的原因可能是由于数据框中的重复项或空白。检查您要加入的列(使用合并时),看看是否有重复项或空白。如果是这样,请使用此命令摆脱它们:
df.drop_duplicates(subset ='column_name', keep = False, inplace = True)
然后重新运行你的python/pandas代码。这对我有用。
可能左侧数据框的合并列中有 NaN,导致最终合并后的数据框膨胀。
如果可以,用零填充左侧数据框中的合并列。
df['left_column'] = df['left_column'].fillna(0)
然后进行合并。看看你得到了什么。