如何使用Python Pandas匹配多DataFrame的ID并为主DataFrame添加分类列
解决思路与代码实现
步骤说明
- 先将两类ID转为集合,利用集合的快速查找特性提升匹配效率;
- 编写自定义函数处理每个ID单元格:
- 按分号分割ID并去除多余空格;
- 优先判断是否存在第一类ID,存在则标记「第一类型」;
- 若没有第一类ID,检查所有ID是否都属于第二类,是则标记「第二类型」;
- 其余情况返回
NaN;
- 用
apply将函数批量应用到ID列,生成新分类列。
代码示例
import pandas as pd import numpy as np # 构造示例数据(可替换为你的Excel导入数据) main_df = pd.DataFrame({ 'ID': ['1234; 5678', '5678', '9def', '1234; 9abc', '123; 456'], '其他列': ['a', 'b', 'c', 'd', 'e'] }) type1_df = pd.DataFrame({'ID': ['1234', '9def']}) type2_df = pd.DataFrame({'ID': ['5678', '9abc']}) # 将两类ID转为集合,优化查找速度 type1_set = set(type1_df['ID']) type2_set = set(type2_df['ID']) # 自定义分类函数 def classify_ids(id_str): # 分割并清洗ID列表 ids = [id.strip() for id in id_str.split(';')] # 检查是否包含第一类ID has_type1 = any(id in type1_set for id in ids) if has_type1: return '第一类型' # 检查是否全部为第二类ID all_type2 = all(id in type2_set for id in ids) if all_type2: return '第二类型' # 不符合上述情况返回空值 return np.nan # 生成新分类列 main_df['分类'] = main_df['ID'].apply(classify_ids) print(main_df)
输出结果
ID 其他列 分类 0 1234; 5678 a 第一类型 1 5678 b 第二类型 2 9def c 第一类型 3 1234; 9abc d 第一类型 4 123; 456 e NaN
补充说明
- 用集合替代
isin或contains方法,能大幅提升多ID场景下的匹配效率; - 函数逻辑严格遵循优先级:先判断第一类ID,再判断第二类全匹配,完全符合需求规则;
- 如果ID存在大小写、特殊字符等格式问题,可以在分割后增加清洗步骤(比如统一转大写、去除特殊符号)。
内容的提问来源于stack exchange,提问作者Maze
相关产品推荐
相关产品推荐

