如何在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重复的行,而非简单拼接或取交集合并,正确步骤如下:
- 先用
pd.concat()拼接所有DataFrame,得到包含重复行的临时DataFrame - 使用
drop_duplicates()按_id列去重,保留需要的行(首次/末次出现均可) - 可选:重置索引,让索引连续
代码示例
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
相关产品推荐
相关产品推荐

