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

如何在Python中合并多个DataFrame并按_id列去重?

合并DataFrame列表并按_id去重

问题描述

现有一个DataFrame列表,每个DataFrame都包含_id列,希望合并后保留所有不重复的_id对应的行,最终得到无重复_id的DataFrame。

当前DataFrame列表示例:

0  thyx07y1bg8   ...     2000-03-31   2004-12-31
1   ofr7s6wf1j   ...     2000-03-31   2004-12-31
[2 rows x 4 columns],            _id    ... calculate_from calculate_to
0  3sw1btgso6t   ...     2000-03-31   2004-12-31
1   ofr7s6wf1j   ...     2000-03-31   2004-12-31
[2 rows x 4 columns]

期望结果:

0  thyx07y1bg8    ...     2000-03-31   2004-12-31
1   ofr7s6wf1j    ...     2000-03-31   2004-12-31
2  3sw1btgso6t    ...     2000-03-31   2004-12-31
[3 rows x 4 columns]

已尝试pd.concat(df)和reduce(lambda left, right: pd.merge(left, right, on=["_id"], how="inner"),df),均无法得到预期结果。


解决方案

你的需求是合并所有DataFrame后,去除_id重复的行,而非简单拼接或取交集合并,正确步骤如下:

  1. 先用pd.concat()拼接所有DataFrame,得到包含重复行的临时DataFrame
  2. 使用drop_duplicates()按_id列去重,保留需要的行(首次/末次出现均可)
  3. 可选:重置索引,让索引连续

代码示例

import pandas as pd

# 假设你的DataFrame列表名为 df_list
# 1. 拼接所有DataFrame
merged_temp = pd.concat(df_list)
# 2. 按_id去重,保留第一次出现的行;若要保留末次,将keep改为"last"
final_df = merged_temp.drop_duplicates(subset="_id", keep="first")
# 3. 重置索引(可选)
final_df = final_df.reset_index(drop=True)

原方法失效原因

  • pd.concat(df):仅做简单行拼接,会保留所有重复的_id行(如示例中ofr7s6wf1j会出现两次),不符合去重需求
  • reduce(...)的inner merge:取多个DataFrame的_id交集,仅保留所有DF都存在的_id(示例中仅ofr7s6wf1j),丢失了独有的_id,因此结果不符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:45:47