【问题标题】:Pandas: Merge array is too big, large, how to merge in parts?Pandas:合并数组太大,太大,如何分块合并?
【发布时间】:2014-09-22 16:25:54
【问题描述】:

尝试使用 pandas 合并两个数据帧时,我收到以下消息:“ValueError:数组太大。”我估计合并后的表将有大约 50 亿行,这对于我的 8GB RAM 的计算机来说可能太多了(这仅受我的 RAM 限制还是它内置在 pandas 系统中?)。

我知道,一旦我有了合并表,我将计算一个新列,然后过滤行,寻找组内的最大值。因此最终的输出表将只有 250 万行。

我怎样才能打破这个问题,以便我可以在较小的部分上执行这个合并方法并建立输出表,而不会达到我的 RAM 限制?

下面的方法适用于这个小数据,但在更大的真实数据上失败:

import pandas as pd
import numpy as np

# Create input tables
t1 = {'scenario':[0,0,1,1],
      'letter':['a','b']*2,
      'number1':[10,50,20,30]}

t2 = {'letter':['a','a','b','b'],
      'number2':[2,5,4,7]}

table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)

# Merge the two, create the new column. This causes "...array is too big."
table3 = pd.merge(table1,table2,on='letter')
table3['calc'] = table3['number1']*table3['number2']

# Filter, bringing back the rows where 'calc' is maximum per scenario+letter
table3 = table3.loc[table3.groupby(['scenario','letter'])['calc'].idxmax()]

这是对前两个问题的后续:

Does iterrows have performance issues?

What is a good way to avoid using iterrows in this example?

我在下面回答我自己的问题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 groupby 分解第一个表(例如,在“场景”上)。首先创建一个新变量,为您提供所需大小的组可能是有意义的。然后iterate through these groups 对每个执行以下操作:执行新的合并、过滤,然后将较小的数据附加到最终输出表中。

    正如“迭代是否存在性能问题?”中所述,迭代很慢。因此,请尝试使用大组来使用最有效的方法来保持它。在合并方面,Pandas 是 relatively quick

    从创建输入表之后开始

    table3 = pd.DataFrame()
    
    grouped = table1.groupby('scenario')
    
    for _, group in grouped: 
        temp = pd.merge(group,table2, on='letter')
        temp['calc']=temp['number1']*temp['number2']
        table3 = table3.append(temp.loc[temp.groupby('letter')['calc'].idxmax()])
        del temp
    

    【讨论】:

    • 我试图通过每次迭代删除 temp 来提高内存效率。这个增值还是不增值?我想避免创建保留在内存中的对象。 append() 是正确的选择吗?我很想听听这个“太大而无法合并”问题的任何其他解决方案,谢谢。
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2017-06-18
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多