gpt4 book ai didi

python - Pandas: Merge array is too big, large, 如何分段合并?

转载 作者:行者123 更新时间:2023-11-28 19:21:01 34 4
gpt4 key购买 nike

尝试使用 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?

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

最佳答案

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

如“iterrows 是否存在性能问题?”中所述,迭代速度很慢。因此,尝试使用大群体来使用最有效的方法来保持它。 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

关于python - Pandas: Merge array is too big, large, 如何分段合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046813/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com