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

如何用Pandas为指定列匹配对应值且避免重复

Pandas匹配指定列数值且保留原表行数的解决方案

需求

使用Pandas为指定列的数值匹配对应值,且不产生重复数据,严格保留原左表的行数。

现有数据

df1

IN  name1   size    ttee    date        days    new date    year    month
AA1 dd      1       FALSE   1/14/2023   10      1/14/2023   2023    January
AA1 ff      2       FALSE   1/9/2023    10      1/9/2023    2023    January
AA1 jj      3       FALSE   1/8/2023    10      1/8/2023    2023    January
AA1 mm      4       FALSE   1/9/2023    10      1/9/2023    2023    January
AA1 nn      5       FALSE   1/29/2023   10      1/29/2023   2023    January

df2

name    stat    year    month   
AA1     KZZ:1   2022    January 
AA1     KZZ:1   2023    April   
AA1     KZZ:1   2023    March   
AA1     KZZ:1   2022    February    
AA1     KZZ:1   2022    April   
AA1     KZZ:1   2022    September
AA1     KZZ:1   2022    February    
AA1     KZZ:1   2022    March   
AA1     KZZ:1   2023    June    
AA1     KZZ:1   2022    December
AA1     KZZ:1   2022    January 
AA1     KZZ:1   2022    January 

期望结果

IN  name1   size    ttee    date        days    new date    year    month   stat
AA1 dd      1       FALSE   1/14/2023   10      1/14/2023   2023    January KZZ:1
AA1 ff      2       FALSE   1/9/2023    10      1/9/2023    2023    January KZZ:1
AA1 jj      3       FALSE   1/8/2023    10      1/8/2023    2023    January KZZ:1
AA1 mm      4       FALSE   1/9/2023    10      1/9/2023    2023    January KZZ:1
AA1 nn      5       FALSE   1/29/2023   10      1/29/2023    2023    January KZZ:1

尝试代码及问题

尝试代码:

out = pd.merge(df1,df2.drop_duplicates(), left_on=['IN'], right_on= ['name'], how="left")

问题:执行后生成了膨胀的组合结果,未保留原左表行数。原因是df2.drop_duplicates()仅去除完全重复的行,但仍存在多个name=AA1的不同行(因year和month字段不同),左连接时每个df1的行都会与这些行一一匹配,导致行数倍增。

解决方法

核心思路是先构建name与stat的唯一映射表,确保每个name仅对应一行数据,再进行合并:

  1. 从df2中提取name和stat的唯一组合,生成映射表:
# 提取并去重,得到name与stat的唯一对应关系
df2_mapping = df2[['name', 'stat']].drop_duplicates()
  1. 使用映射表与df1进行左连接,保留原表行数:
# 执行合并
out = pd.merge(df1, df2_mapping, left_on=['IN'], right_on=['name'], how='left')
# 移除多余的name列(可选操作)
out = out.drop(columns=['name'])

执行上述代码后,即可得到与期望结果一致的输出,既完成了stat值的匹配,又严格保留了原左表的行数,不会产生重复数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:17:48