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

多列DataFrame去重最佳实践?合并后精准去重方法问询

解决合并DataFrame后重复项问题的精准方案

核心思路

你的目标是最终结果与第一个DataFrame(31k条)数量一致,说明重复根源是第二个DataFrame中存在同一ID对应多条记录,合并时导致第一个DF的每条记录被多次匹配。优先处理第二个DF的重复,比合并后去重更高效准确。


步骤1:定位第二个DF的重复ID及差异

先找出重复ID并分析对应记录的列差异,判断哪些是真实重复:

# 假设ID列名为'id',替换成你的实际列名
# 提取所有重复的ID
duplicate_ids = df2[df2.duplicated(subset='id', keep=False)]['id'].unique()
# 查看这些ID的所有记录,按ID排序便于对比
df2_duplicates = df2[df2['id'].isin(duplicate_ids)].sort_values('id')
print(df2_duplicates)

观察输出:

  • 如果同一ID下所有列完全一致:属于纯重复,直接去重即可。
  • 如果同一ID下部分列有差异:需判断差异是否有效(比如是否是不同状态/版本,还是录入错误)。

步骤2:根据差异处理第二个DF

场景1:同一ID下无有效差异(纯重复)

直接按ID去重,保留任意一条记录:

df2_clean = df2.drop_duplicates(subset='id', keep='first')
# 执行左合并,确保结果行数与df1一致
df_final = pd.merge(df1, df2_clean, on='id', how='left')

场景2:同一ID下有有效差异,但只需保留一条

先按优先级排序(比如更新时间、状态),再去重:

# 示例:按更新时间降序,保留最新的一条记录
df2_sorted = df2.sort_values(by='update_time', ascending=False)
df2_clean = df2_sorted.drop_duplicates(subset='id', keep='first')
df_final = pd.merge(df1, df2_clean, on='id', how='left')

场景3:需保留同一ID下的所有差异(合并为单行)

对差异列做聚合处理,避免重复df1的记录:

# 示例:将差异列合并为列表,其他列取第一个有效值
df2_agg = df2.groupby('id').agg({
    'field1': 'first',  # 无差异的列取第一个值
    'field2': 'first',
    'diff_field': list  # 有差异的列合并为列表
}).reset_index()
df_final = pd.merge(df1, df2_agg, on='id', how='left')

若已合并完成,直接在结果中去重

如果已经完成合并,以ID为基准保留唯一记录:

# 按ID分组取第一条,或按规则筛选后去重
df_final = df_final.sort_values(by='update_time', ascending=False).drop_duplicates(subset='id', keep='first')

验证结果

检查最终行数是否符合预期:

print(f"最终记录数:{len(df_final)}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:01:18