Python实现多条件关联两个DataFrame并抽取匹配信息
实现逻辑
- 提前明确码表(
df_code)需包含Code 1、Code 2、Info 1、Info 2四个字段,业务表为df_biz - 封装通用匹配函数:接收分号分隔的字段值,拆分取出Code 1、Code 2,匹配码表后拼接Info内容返回,无匹配/格式非法时返回空字符串
- 对业务表
Origine、Destination、Other三个字段分别应用匹配函数,生成对应Info字段
可运行代码示例
import pandas as pd # ---------------------- 示例数据构造,可替换为你的实际数据 ---------------------- # 码表:存储编码与释义的映射关系 df_code = pd.DataFrame({ 'Code 1': ['A', 'B', 'C'], 'Code 2': ['01', '02', '03'], 'Info 1': ['始发地北京', '目的地上海', '其他广州'], 'Info 2': ['顺义区', '静安区', '天河区'] }) # 业务表:待匹配的原始业务数据 df_biz = pd.DataFrame({ 'Origine': ['1;A;01', '2;D;04', '3;B;02'], 'Destination': ['1;B;02', '2;A;01', '3;E;05'], 'Other': ['1;C;03', '2;F;06', '3;A;01'], '订单编号': ['ORD001', 'ORD002', 'ORD003'], '金额': [230.5, 560.0, 189.9] }) # ---------------------- 核心匹配逻辑 ---------------------- # 小数据量场景(<10万行)直接用如下实现 def match_info(field_val: str) -> str: # 空值/格式不符合直接返回空 if pd.isna(field_val): return "" parts = str(field_val).split(";") if len(parts) < 3: return "" code1, code2 = parts[1], parts[2] # 匹配码表 res = df_code[(df_code["Code 1"] == code1) & (df_code["Code 2"] == code2)] if res.empty: return "" # 可按需调整Info的拼接格式,比如换成空格、顿号分隔 return f"{res.iloc[0]['Info 1']} {res.iloc[0]['Info 2']}" # 生成三个新字段 df_biz["Info Origine"] = df_biz["Origine"].apply(match_info) df_biz["Info Destination"] = df_biz["Destination"].apply(match_info) df_biz["Info Other"] = df_biz["Other"].apply(match_info) # 输出最终结果 print(df_biz)
大数据量优化方案
若业务表数据量大于10万行,推荐提前把码表转为字典索引,匹配速度可提升10倍以上:
# 提前把码表转为字典,key为(Code1, Code2)元组,value为拼接好的Info内容 code_map = df_code.set_index(["Code 1", "Code 2"]).apply( lambda x: f"{x['Info 1']} {x['Info 2']}", axis=1 ).to_dict() # 优化后的匹配函数 def match_info_fast(field_val: str) -> str: if pd.isna(field_val): return "" parts = str(field_val).split(";") if len(parts) < 3: return "" return code_map.get((parts[1], parts[2]), "") # 应用优化后的函数 df_biz["Info Origine"] = df_biz["Origine"].apply(match_info_fast) df_biz["Info Destination"] = df_biz["Destination"].apply(match_info_fast) df_biz["Info Other"] = df_biz["Other"].apply(match_info_fast)
内容的提问来源于stack exchange,提问作者user17037971
相关产品推荐
相关产品推荐

