基于另一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
相关产品推荐
相关产品推荐

