合并两个DataFrame,重复c1列值仅保留d1对应行的实现方法
合并DataFrame并保留指定表的重复行
问题场景
现有两个均包含c1、c2列的DataFrame(记为d1和d2),合并时需保留d1的所有行,同时加入d2中c1列未在d1出现过的行;若c1列存在重复值,仅保留d1中的对应行。
示例数据
d1内容:
Customer Status 0 Alice closed 1 Bob in-progress 2 John closed
d2内容:
Customer Status 0 Alice in-progress 1 Lara in-progress 2 Santa closed
期望结果:
Customer Status 0 Alice closed 1 Bob in-progress 2 John closed 3 Lara in-progress 4 Santa closed
解决方案
方法1:合并后去重(优先保留d1行)
先将d1和d2纵向合并,再以c1列(示例为Customer)为依据去重,保留首次出现的行(因合并时先放d1,首次出现的就是d1的行)。
代码示例:
import pandas as pd df1 = pd.DataFrame({"Customer":["Alice", "Bob", "John"], "Status":["closed","in-progress","closed"]}) df2 = pd.DataFrame({"Customer":["Alice", "Lara", "Santa"], "Status":["in-progress","in-progress","closed"]}) # 合并两个DataFrame,顺序为df1在前、df2在后 combined = pd.concat([df1, df2]) # 按Customer列去重,保留第一次出现的行,重置索引 result = combined.drop_duplicates(subset='Customer', keep='first').reset_index(drop=True) print(result)
方法2:筛选d2独有行后合并
先筛选出d2中c1列未出现在d1里的行,再和d1合并,从根源避免重复。
代码示例:
# 筛选d2中Customer不在df1的Customer集合中的行 d2_unique_rows = df2[~df2['Customer'].isin(df1['Customer'])] # 合并df1和筛选后的d2行 result = pd.concat([df1, d2_unique_rows]).reset_index(drop=True) print(result)
方法3:外连接+字段填充
通过外连接合并两个DataFrame,优先使用d1的字段值,缺失部分用d2的填充,适合多字段场景。
代码示例:
# 外连接合并,为两个表的Status字段添加后缀区分 merged = df1.merge(df2, on='Customer', how='outer', suffixes=('_d1', '_d2')) # 优先用df1的Status,无值则用df2的Status填充 merged['Status'] = merged['Status_d1'].fillna(merged['Status_d2']) # 保留目标列并重置索引 result = merged[['Customer', 'Status']].reset_index(drop=True) print(result)
内容的提问来源于stack exchange,提问作者Joris Kinable
相关产品推荐
相关产品推荐

