繁体   English   中英

在 Pandas 中合并两个大 dataframe

[英]Merging two large dataframe in Pandas

当数据大小如此之大时,我应该如何将 dataframe df (800 万行)中的label列合并到另一个 dataframe df2 (1.43 亿行)?

基本上我只想 map label列到df2 ,除label列之外, df中的所有数据都包含在df2中。 无论如何我可以解决这个问题而不是使用merge()吗?

尝试运行下面的代码,但它一直运行了 5 个小时但没有任何响应。

result = pd.merge(df,df2,on=["X", "Y", "Z"], how='left')
result

df

在此处输入图像描述

df2

在此处输入图像描述

我可以在这里看到一些你可以做的显而易见的事情:

  1. 假设您只想添加基于X / Y / Z列的BR / G / B是多余的,然后删除R / G最后一列中的df列你当然不需要它们被复制 1.43 亿次。
  2. 根据X / Y / Z的唯一值数量及其数据类型,您可以通过使用如下分类数据类型来减少 memory 占用空间:
# Convert to categorical data types (if every value is unique, don't bother!)
for df_temp in [df, df2]:
    for col in ['X', 'Y', 'Z']:
        df_temp.loc[:, col] = df_temp[col].astype('category')
# Merge using less memory
result = pd.merge(df, df2, on=["X", "Y", "Z"], how='left')
  1. 最后,您可以尝试对数据进行分区并进行破坏性转换,您可以创建多个数据帧,每个数据帧在非重叠范围内都包含X并单独处理它们,然后连接各个结果以提供最终结果,例如:
result_dfs = []
ranges = [0, 1000, 2000, 3000, 4000, ...]
for start, end in zip(ranges[:-1], ranges[1:]):
    df_idx = (df['X'] >= start) & (df['X'] < end)
    df2_idx = (df2['X'] >= start) & (df2['X'] < end)
    result_dfs.append(
        pd.merge(
            df[df_idx], 
            df2[df2_idx], 
            on=["X", "Y", "Z"], 
            how='left'
        )
    )
    # Remove the original data to to reduce memory consumption
    df2 = df2[~df2_idx]
result = pd.concat(result_dfs)

但这可能仍然行不通,因为当您进行最终连接时,您仍然需要在短时间内将 memory 中的完整数据集两次!

如果这些都不起作用,恐怕你需要更多的 memory,或者你需要使用 Pandas 以外的东西来解决你的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM