You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python合并含相似特征的DataFrame,如何避免重复提升性能?

解决Pandas合并DataFrame出现大量重复数据的问题

你遇到的重复是因为**Name+Age的组合在两个DataFrame中都存在重复行**,merge/join会对每个匹配的组合做笛卡尔积——比如df1里t,10有2条HH记录,df2里t,10有2条year记录,合并后就会生成2×2=4条重复组合的行,这就是数据体积膨胀的核心原因。

下面根据不同场景给出优化方案:

场景1:每组Name,Age对应多个HH/year,想保留所有数据但减少冗余

把每组的多值合并成列表(或其他聚合形式)后再合并,这样每组只占一行,大幅压缩数据体积:

import pandas as pd

# 处理df1:将同一Name+Age的HH合并为列表
df1_agg = df1.groupby(['Name', 'Age'])['HH'].apply(list).reset_index()
# 处理df2:将同一Name+Age的year合并为列表
df2_agg = df2.groupby(['Name', 'Age'])['year'].apply(list).reset_index()
# 合并聚合后的DataFrame
res = pd.merge(df2_agg, df1_agg, on=['Name', 'Age'], how='inner')

合并结果示例:

Name  Age       year       HH
0    j   14      [102]     [66]
1    n   15  [101, 81]   [5, 55]
2    t   10  [100, 81]    [5, 8]

后续可根据需求拆分列表做进一步处理。

场景2:原始数据存在无效重复,需先去重再合并

如果每组Name,Age理论上应对应唯一的HH/year,先对两个DataFrame去重再合并:

# 对df1去重(保留每组第一条,可根据需求修改keep参数为'last'或False)
df1_dedup = df1.drop_duplicates(subset=['Name', 'Age'], keep='first')
# 对df2去重
df2_dedup = df2.drop_duplicates(subset=['Name', 'Age'], keep='first')
# 合并去重后的DataFrame
res = pd.merge(df2_dedup, df1_dedup, on=['Name', 'Age'], how='inner')

合并结果示例:

Name  Age  year  HH
0    t   10   100   5
1    n   15   101   5
2    j   14   102  66

场景3:必须保留所有原始行,优化合并性能

如果业务需要保留全部行,可通过以下方式提升合并速度:

  • 提前设置Name和Age为索引,减少合并时的计算开销
  • 关闭merge的默认排序(sort=False),避免额外的排序耗时
# 方式1:用join,提前设置索引
df1.set_index(['Name', 'Age'], inplace=True)
df2.set_index(['Name', 'Age'], inplace=True)
res = df2.join(df1, sort=False)

# 方式2:用merge,关闭排序
res = pd.merge(df2, df1, on=['Name', 'Age'], how='inner', sort=False)

内容的提问来源于stack exchange,提问作者user14269252

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:40:26