如何高效利用唯一ID标准化Pandas DataFrame中的姓名变体?
高效实现方法
步骤1:构建全局ID-姓名映射字典
先把所有ID列和对应姓名列的配对数据整合,按ID去重后取第一个出现的姓名作为标准值,生成映射字典:
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame({ 'left1_id': ['01', '01', '03', '04'], 'right1_id': ['02', '02', '04', '03'], 'left2_id': ['03', '03', '01', '01'], 'right2_id': ['04', '04', '02', '02'], 'left1_name': ['John Doe', 'John A. Doe', 'Mike D. Smith', 'Ana B. Smith'], 'right1_name': ['Jane Doe', 'Jane Doe', 'Ana Smith', 'Mike D. Smith'], 'left2_name': ['Mike Smith', 'Mike Smith', 'John Doe', 'John C. Doe'], 'right2_name': ['Ana Smith', 'Ana B. Smith', 'Jane C. Doe', 'Jane C. Doe'] }) # 定义所有ID列与对应姓名列的配对关系 id_name_pairs = [ ('left1_id', 'left1_name'), ('right1_id', 'right1_name'), ('left2_id', 'left2_name'), ('right2_id', 'right2_name') ] # 收集所有ID-姓名对并合并 all_id_name_pairs = pd.concat([ df[[id_col, name_col]].rename(columns={id_col: 'id', name_col: 'name'}) for id_col, name_col in id_name_pairs ]) # 生成映射字典:按ID去重,保留首次出现的姓名 id_name_map = all_id_name_pairs.drop_duplicates(subset='id', keep='first') \ .set_index('id')['name'] \ .to_dict()
步骤2:批量标准化所有姓名列
遍历每个姓名列,根据对应的ID列值,用映射字典批量替换姓名:
for id_col, name_col in id_name_pairs: df[name_col] = df[id_col].map(id_name_map)
方法优势
- 利用Pandas向量化操作替代逐行循环,处理大数据集时效率更高
- 全局映射字典只需构建一次,避免重复计算
- 扩展性强:新增ID/姓名列时,只需在
id_name_pairs中添加对应关系即可
内容的提问来源于stack exchange,提问作者duarte harris
相关产品推荐
相关产品推荐

