如何堆叠列数不同的两个Pandas DataFrame且优先保留第二个表的重复观测行
解决方案
你可以通过concat拼接+按公共键去重的方式实现需求,全程使用Pandas原生接口,逻辑简洁效率也高:
- 先定义两张表的公共匹配列
common_cols = ['id', 'month', 'year', 'purchase', 'category']
- 按优先保留表在前的顺序拼接两个DataFrame:把需要优先保留的第二个表放在concat的第一个参数位置,这样重复行拼接后第二个表的行排在前面
import pandas as pd combined = pd.concat([df2, df1], ignore_index=True)
- 按公共列去重,默认保留第一个出现的行,也就是优先保留第二个表的对应行
result = combined.drop_duplicates(subset=common_cols, keep='first')
逻辑说明
- 拼接时第二个表在前,重复的匹配行在拼接结果里第二个表的行顺序更靠前
drop_duplicates指定subset为5个公共列,只要这5列值完全一致就判定为重复行,keep='first'会保留顺序靠前的第二个表的行,自动删除排在后面的第一个表的重复行- 第一个表里独有的行不会被删除,第二个表多出来的列会自动用NaN填充,完全符合你给出的预期输出格式
可选优化
如果两个表各自内部就存在公共列重复的行,可以先分别做去重再拼接,避免内部重复影响结果:
df1_clean = df1.drop_duplicates(subset=common_cols, keep='first') df2_clean = df2.drop_duplicates(subset=common_cols, keep='first') combined = pd.concat([df2_clean, df1_clean], ignore_index=True) result = combined.drop_duplicates(subset=common_cols, keep='first')
内容的提问来源于stack exchange,提问作者Yuxxxxxx
相关产品推荐
相关产品推荐

