大 pandas DataFrames 的外部合并导致 MemoryError---"big data" 如何与 pandas 合并?
Outer merge on large pandas DataFrames causes MemoryError---how to do "big data" merges with pandas?
我有两个 pandas DataFrame df1
和 df2
具有相当标准的格式:
one two three feature
A 1 2 3 feature1
B 4 5 6 feature2
C 7 8 9 feature3
D 10 11 12 feature4
E 13 14 15 feature5
F 16 17 18 feature6
...
与 df2
的格式相同。这些 DataFrame 的大小约为 175MB 和 140MB。
merged_df = pd.merge(df1, df2, on='feature', how='outer', suffixes=('','_features'))
我收到以下内存错误:
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 39, in merge
return op.get_result()
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 217, in get_result
join_index, left_indexer, right_indexer = self._get_join_info()
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 353, in _get_join_info
sort=self.sort, how=self.how)
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 559, in _get_join_indexers
return join_func(lkey, rkey, count, **kwargs)
File "pandas/src/join.pyx", line 187, in pandas.algos.full_outer_join (pandas/algos.c:61680)
File "pandas/src/join.pyx", line 196, in pandas.algos._get_result_indexer (pandas/algos.c:61978)
MemoryError
合并时 pandas 数据帧是否可能存在 "size limit"?我很惊讶这行不通。也许这是某个版本 pandas 的错误?
编辑:如评论中所述,合并列中的许多重复项很容易导致 RAM 问题。参见:Python Pandas Merge Causing Memory Overflow
现在的问题是,我们如何进行合并?似乎最好的方法是以某种方式对数据帧进行分区。
尝试为数字列指定数据类型以减小现有数据框的大小,例如:
df[['one','two', 'three']] = df[['one','two', 'three']].astype(np.int32)
这应该会显着减少内存,并有望让您执行合并。
您可以尝试先通过 unique
values, merge
and last concat
输出过滤 df1
。
如果只需要outer join,我觉得也是内存问题。但是,如果为每个循环的过滤器输出添加一些其他代码,它就可以工作。
dfs = []
for val in df.feature.unique():
df1 = pd.merge(df[df.feature==val], df2, on='feature', how='outer', suffixes=('','_key'))
#
#df1 = df1[(df1.start <= df1.start_key) & (df1.end <= df1.end_key)]
print (df1)
dfs.append(df1)
df = pd.concat(dfs, ignore_index=True)
print (df)
其他解决方案是使用 dask.dataframe.DataFrame.merge
.
我有两个 pandas DataFrame df1
和 df2
具有相当标准的格式:
one two three feature
A 1 2 3 feature1
B 4 5 6 feature2
C 7 8 9 feature3
D 10 11 12 feature4
E 13 14 15 feature5
F 16 17 18 feature6
...
与 df2
的格式相同。这些 DataFrame 的大小约为 175MB 和 140MB。
merged_df = pd.merge(df1, df2, on='feature', how='outer', suffixes=('','_features'))
我收到以下内存错误:
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 39, in merge
return op.get_result()
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 217, in get_result
join_index, left_indexer, right_indexer = self._get_join_info()
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 353, in _get_join_info
sort=self.sort, how=self.how)
File "/nfs/sw/python/python-3.5.1/lib/python3.5/site-packages/pandas/tools/merge.py", line 559, in _get_join_indexers
return join_func(lkey, rkey, count, **kwargs)
File "pandas/src/join.pyx", line 187, in pandas.algos.full_outer_join (pandas/algos.c:61680)
File "pandas/src/join.pyx", line 196, in pandas.algos._get_result_indexer (pandas/algos.c:61978)
MemoryError
合并时 pandas 数据帧是否可能存在 "size limit"?我很惊讶这行不通。也许这是某个版本 pandas 的错误?
编辑:如评论中所述,合并列中的许多重复项很容易导致 RAM 问题。参见:Python Pandas Merge Causing Memory Overflow
现在的问题是,我们如何进行合并?似乎最好的方法是以某种方式对数据帧进行分区。
尝试为数字列指定数据类型以减小现有数据框的大小,例如:
df[['one','two', 'three']] = df[['one','two', 'three']].astype(np.int32)
这应该会显着减少内存,并有望让您执行合并。
您可以尝试先通过 unique
values, merge
and last concat
输出过滤 df1
。
如果只需要outer join,我觉得也是内存问题。但是,如果为每个循环的过滤器输出添加一些其他代码,它就可以工作。
dfs = []
for val in df.feature.unique():
df1 = pd.merge(df[df.feature==val], df2, on='feature', how='outer', suffixes=('','_key'))
#
#df1 = df1[(df1.start <= df1.start_key) & (df1.end <= df1.end_key)]
print (df1)
dfs.append(df1)
df = pd.concat(dfs, ignore_index=True)
print (df)
其他解决方案是使用 dask.dataframe.DataFrame.merge
.