大Pandas数据帧上的外部合并导致内存错误——如何将“大数据”与Pandas合并?

2024-04-29 05:10:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个pandas数据帧df1df2,格式相当标准:

   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的相同格式。这些数据帧的大小约为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

合并时熊猫数据帧是否有“大小限制”?我很惊讶这不起作用。也许这是熊猫的某个版本的虫子?

编辑:如注释中所述,合并列中的许多重复项很容易导致RAM问题。见:Python Pandas Merge Causing Memory Overflow

现在的问题是,我们如何进行合并?似乎最好的方法是以某种方式对数据帧进行分区。


Tags: 数据inpypandasgetlibpackagesline
2条回答

您可以尝试通过^{}值、merge和最后一个^{}输出来筛选df1

如果只需要外部连接,我想还有内存问题。但是如果为每个循环的过滤器输出添加一些其他代码,它就可以工作。

dfs = []
for val in df.feature.unique():
    df1 = pd.merge(df[df.feature==val], df2, on='feature', how='outer', suffixes=('','_key'))
    #http://stackoverflow.com/a/39786538/2901002
    #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)

另一种解决方案是使用^{}

尝试为数值列指定数据类型以减小现有数据帧的大小,例如:

df[['one','two', 'three']] = df[['one','two', 'three']].astype(np.int32)

这将显著减少内存,并有望让您执行合并。

相关问题 更多 >