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
相关产品推荐
相关产品推荐

