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

基于另一DataFrame的ID与Name列值为目标DataFrame的Type列赋值

问题描述

现有两个DataFrame:df1和df2,具体结构如下:

import pandas as pd
df1 = pd.DataFrame({'ID': [1, 2, 3, 5], 
                    'Name': ['client', 'detail_client', 'operations', 'audit'],
                    'Type': ['str', 'var', 'str', 'nvar']})
df2 = pd.DataFrame({'ID': [5, 3, 7, 2], 
                    'Name': ['audit', 'operations', 'C', 'detail_client'],
                    'Type': ['nan', 'nan', 'nan', 'nan']})

需要编写一个函数,接收df1、df2以及双方对应的ID列、Name列、Type列名作为参数(因列名可能不固定)。函数逻辑为:当df1的ID值与df2的ID值相等且df1的Name值与df2的Name值相等时,将df2的Type列值设置为df1的Type列值。最终返回处理后的df2,预期结果如下:

df2 = pd.DataFrame({'ID': [5, 3, 7, 2], 
                    'Name': ['audit', 'operations', 'C', 'detail_client'],
                    'Type': ['nvar', 'str', 'nan', 'var']})
实现方案

函数实现(基于Pandas向量化操作)

采用Pandas索引映射完成匹配更新,避免逐行遍历的低效问题,同时支持自定义列名:

import pandas as pd

def update_df2_type(df1, df2, df1_id_col, df1_name_col, df1_type_col, df2_id_col, df2_name_col, df2_type_col):
    # 从df1创建(ID, Name)到Type的映射表
    type_mapping = df1.set_index([df1_id_col, df1_name_col])[df1_type_col]
    # 生成df2的匹配索引
    df2_match_index = df2[[df2_id_col, df2_name_col]].set_index([df2_id_col, df2_name_col]).index
    # 匹配Type值,未匹配到的保留原df2的Type值
    df2[df2_type_col] = df2_match_index.map(type_mapping.get).fillna(df2[df2_type_col])
    return df2

测试验证

用题目给出的示例数据测试:

# 初始化数据
df1 = pd.DataFrame({'ID': [1, 2, 3, 5], 
                    'Name': ['client', 'detail_client', 'operations', 'audit'],
                    'Type': ['str', 'var', 'str', 'nvar']})
df2 = pd.DataFrame({'ID': [5, 3, 7, 2], 
                    'Name': ['audit', 'operations', 'C', 'detail_client'],
                    'Type': [pd.NA, pd.NA, pd.NA, pd.NA]})

# 调用函数(双方列名一致,直接传列名字符串)
updated_df2 = update_df2_type(df1, df2, 'ID', 'Name', 'Type', 'ID', 'Name', 'Type')

print(updated_df2)

输出结果:

ID           Name   Type
0   5           audit  nvar
1   3      operations   str
2   7              C   <NA>
3   2  detail_client   var

方案说明

  • 采用索引映射方式实现匹配,比逐行遍历效率高数倍,适合大数据量场景
  • 完全支持自定义列名,满足参数化需求
  • 自动保留df2中未匹配行的原始Type值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 03:16:28