Pandas如何按多列联合匹配对齐同值行并去除重复数据
pandas实现三字段联合匹配对齐的可行方案
核心逻辑是直接使用pandas原生的多键合并能力,不需要手动写逐列判断逻辑,15000行规模的表单处理无性能压力。
前置校验
首先确认拆分得到的两个DataFrame(下文命名为df_a、df_b)中,三个匹配字段Product ID、Region、Country的字段名完全一致;如果两张表的成本类字段重名,提前重命名做区分,避免合并时字段冲突:
# 示例:将两表同名列重命名为可区分的名称,按实际业务字段修改即可 df_a = df_a.rename(columns={"Cost": "Cost_Period1"}) df_b = df_b.rename(columns={"Cost": "Cost_Period2"})
三列联合匹配对齐
调用pd.merge()方法,将三个匹配字段以列表形式传入on参数,即可实现三字段取值完全一致时才对齐的匹配逻辑,可根据需求选择连接方式:
# 全外连接:保留两张表所有记录,匹配到的行自动对齐成本字段,未匹配到的对应成本列留空 aligned_df = pd.merge( df_a, df_b, on=["Product ID", "Region", "Country"], # 传入多字段列表即实现联合匹配 how="outer" )
连接方式选择参考:
- 仅保留两表中三字段完全匹配的记录:
how="inner" - 保留
df_a全部记录,匹配df_b中对应成本:how="left" - 保留
df_b全部记录,匹配df_a中对应成本:how="right"
去重与收尾
合并完成后按三个匹配字段去重,即可得到无重复信息的对齐结果:
# 按三个联合键去重,保留第一条有效记录 aligned_df = aligned_df.drop_duplicates( subset=["Product ID", "Region", "Country"], keep="first" ) # 可选:空值填充,比如将缺失的成本值填充为0 # aligned_df[["Cost_Period1", "Cost_Period2"]] = aligned_df[["Cost_Period1", "Cost_Period2"]].fillna(0)
方案说明
之前使用np.where、isin仅能实现单列匹配的原因是,这类方法默认做单值判断,多列联合匹配需要手动将多列拼接为元组再做判断,写法冗余且性能差。merge是pandas原生实现的关联逻辑,针对大数据量做了性能优化,比手写判断逻辑效率高1~2个数量级,完全适配万行级以上的表格处理需求。
内容的提问来源于stack exchange,提问作者user19391566
相关产品推荐
相关产品推荐

