You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:57:05