基于多条件按ID映射pandas DataFrame的Code列值
解决方案:按ID批量替换Pandas DataFrame的Code列值
需求回顾
针对含10万行的DataFrame,按ID规则替换Code列:
- 若某ID同时关联
Code name和Code ID,该ID所有行的Code替换为Code ID对应的数值 - 若ID仅关联一种类型,保持原Code值不变
示例数据
import pandas as pd df = pd.DataFrame({'ID' : ['ID 1', 'ID 1', 'ID 1', 'ID 2', 'ID 2', 'ID 3', 'ID 3'], 'Code' : ['Apple', 'A123', 'Apple', 'Banana', 'Banana', 'K123', 'K123'], 'Code_Type' : ['Code name', 'Code ID', 'Code name', 'Code name', 'Code name', 'Code ID', 'Code ID']} )
步骤1:生成目标映射字典
通过分组聚合判断每个ID的类型集合,生成ID到目标Code值的映射:
# 按ID分组,统计每个ID的Code类型集合和Code值列表 id_grouped = df.groupby('ID').agg( code_types=('Code_Type', set), code_list=('Code', list) ).reset_index() # 构建映射字典 code_mapping = {} for _, row in id_grouped.iterrows(): current_id = row['ID'] types = row['code_types'] # 同时存在两种类型时,取Code ID对应的Code值 if {'Code name', 'Code ID'} <= types: target_code = df[(df['ID'] == current_id) & (df['Code_Type'] == 'Code ID')]['Code'].iloc[0] else: # 仅一种类型时,取该ID任意一个Code值(同ID同类型Code值一致) target_code = row['code_list'][0] code_mapping[current_id] = target_code
生成的映射字典如下:
{'ID 1': 'A123', 'ID 2': 'Banana', 'ID 3': 'K123'}
步骤2:应用映射替换Code列
使用map方法批量替换,效率远高于逐行循环(适配10万行数据):
df['Code'] = df['ID'].map(code_mapping)
最终结果
处理后的DataFrame:
ID Code Code_Type ID 1 A123 Code name ID 1 A123 Code name ID 1 A123 Code ID ID 2 Banana Code name ID 2 Banana Code name ID 3 K123 Code ID ID 3 K123 Code ID
内容的提问来源于stack exchange,提问作者Kenny Carter Jr
相关产品推荐
相关产品推荐

