熊猫:使用循环合并数据帧-MemoryError

时间:2018-08-07 15:39:17

标签: python pandas

我在名为 my_dict dict 中存储了一些数据帧。字典的键存储在名为 filter_list 的列表中。

filter_list = ["A", "B", "C", ...] 

my_dict [A] 给我以下结果:

    links       A
0   Q11@8.jpg   1
1   Q11@11.jpg  1
2   Q11@4.2.jpg 1
3   Q11@4.3.jpg 1

my_dict [B] 给我以下结果:

    links       B
0   Q11@8.jpg   1
1   A11@21.jpg  1
2   Q11@42.jpg  1
3   C11@4.jpg   1

以此类推...

现在,我想合并所有数据框。我使用外部联接逻辑,因为我希望最终的数据框包括“链接”列内所有数据框中存在的所有可能的链接。

这样,我使用循环来迭代合并它们,但是我不断收到一条错误消息告诉我

  

MemoryError:

,没有更多信息。为了在循环中释放RAM,我将结果保存到一个pickle文件中,但这似乎也无济于事。我仍然遇到相同的错误。

这是我正在使用的代码:

for index in tqdm(range(2,len(filter_list))):
    try:
        result = pd.read_pickle("result.pkl")
    except:
        pass
    if index == 2:
        result = pd.merge(my_data[filter_list[0]], my_data[filter_list[1]], on="links", how="outer")
    result = pd.merge(result , my_data[filter_list[index]], on="links", how="outer")
    result.fillna(0, inplace=True)

    result[result.columns[1:]] = result[result.columns[1:]].astype(int)
    result.to_pickle("result.pkl")
    del result

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试使用pd.concat来实现:

result = (pd.concat([my_dict[key].set_index('links') for key in filter_list],
                    axis=1,sort=False)
            .fillna(0).reset_index())
result[result.columns[1:]] = result[result.columns[1:]].astype(int)

使用您的两个数据框A和B,它给出:

         index  A  B
0    Q11@8.jpg  1  1
1   Q11@11.jpg  1  0
2  Q11@4.2.jpg  1  0
3  Q11@4.3.jpg  1  0
4   A11@21.jpg  0  1
5   Q11@42.jpg  0  1
6    C11@4.jpg  0  1