多次合并使 pandas 中的数据框爆炸并导致 jupyter notebook 中的内存问题

数据挖掘 Python 熊猫 朱庇特 天蓝色毫升
2022-02-18 22:38:51

我使用 pandas 数据框进行了多次合并(请参阅下面的示例脚本)。它使数据帧爆炸并消耗更多内存,因为它的记录达到了 180 亿,df3并尝试与 5Lack 记录合并df4

这导致内存问题。它消耗了 RAM 中的全部内存(140 GB 内存)并且会话被终止。

df = df1[df1_columns].\
    merge(
        df2[df2_columns],
        how='left',
        left_on='col1',
        right_on='col2'
    ).\
    merge(df3[df3_columns], how='left', on='ID').\
    merge(df4[df4_columns], how='left', on='ID')
)

感谢是否有任何解决方案来解决导致问题的连接。

2个回答

第一件事:

  1. 检查您是否仅通过主键加入,即,在您加入的任何列上都没有任何重复值,否则您最终会得到大量且不必要的重复行。

  2. 当加入多个表时,我总是使用函数式编程来reduce提高合并操作的性能:

    from functools import reduce
    
    #create a list that contains all your data frames to be merged
    ldf = [df1,df2,df3,df4]
    #necessary to have a common name column to merge all the frames
    df = reduce(lambda x,y: pd.merge(x,y, on = "id", how = "left"), ldf)
    

希望能帮助到你!

没有任何有关数据的信息,很难回答。

首先,您应该能够估计合并是否确实应该产生 180 亿行:这是预期结果还是错误?您可以通过在一个或两个数据帧中使用真实数据的子集来调查这一点,并查看生成的数据帧的增长速度。

如果此合并操作是具有两个巨大数据帧的完整笛卡尔积,那么这可能是正常结果,这是设计问题。显然,内存量是有物理限制的,在某些时候,用这种大小达到这个限制也就不足为奇了。在这种情况下,解决方案可能是使用更有效的数据结构实现特定代码,或者使用磁盘存储而不是内存存储。