如何基于模糊匹配的多值分隔符键连接两个DataFrame

发布时间 - 2026-01-30 00:00:00    点击率:

本文介绍在pandas中实现“一对多”式条件连接的方法:当df2的dest列以斜杠分隔多个值(如"a/b/c")时,将df1中(org, dest)与df2中org相同且dest为该字符串中任一子项的记录进行左连接。

在实际数据处理中,常遇到连接键不完全一致但存在逻辑包含关系的情况——例如,df2中的 dest 字段存储的是用 / 分隔的多个目标值(如 "A/B/C"),而 df1 中的 dest 是单一值(如 "B")。此时标准的 merge 无法直接匹配,需先对 df2 的 dest 列进行结构化解析,再执行常规连接。

核心思路是:

  1. 将 df2['dest'] 按 '/' 拆分为列表;
  2. 使用 .explode() 将每个列表展开为多行(一行变多行),使复合键扁平化;
  3. 基于标准化后的 (org, dest) 对两表执行 left merge。

✅ 完整实现代码如下:

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'Name': ['Ashok', 'Rahul', 'Anupa', 'Sam'],
    'org':  ['A',     'A',     'B',     'A'],
    'dest': ['B',     'C',     'A',     'B']
})

df2 = pd.DataFrame({
    'org':   ['A', 'B', 'A'],
    'dest':  ['A/B/C', 'C', 'W'],
    'Amount': [10, 20, 30]
})

# 关键步骤:拆分 + 展开 + 连接
df2_exploded = df2.assign(dest=df2['dest'].str.split('/')).explode

('dest') df3 = df1.merge(df2_exploded, on=['org', 'dest'], how='left') print(df3)

输出结果:

    Name org dest  Amount
0  Ashok   A    B    10.0
1  Rahul   A    C    10.0
2  Anupa   B    A     NaN
3    Sam   A    B    10.0

⚠️ 注意事项:

  • str.split('/') 默认返回 list,若某 dest 值不含 /(如 "C" 或 "W"),会生成单元素列表(['C']),explode 仍能正确处理;
  • 若 dest 含空值(NaN),str.split() 会返回 NaN,explode 会保留该行但 dest 为 NaN,可能导致连接失败,建议提前用 df2 = df2.dropna(subset=['dest']) 清洗;
  • 若需严格匹配原始预期输出中 "Rahul" 行 Amount 为空(即不填充 10),说明业务逻辑要求仅匹配 df2 中 org 和 dest 同时精确对应的记录(如 "A" → "A/B/C" 仅当 dest='A' 才匹配),本方案已满足;但注意 "Rahul" 实际应匹配到 df2 第一行(org='A', dest='A/B/C' → 展开后含 'C'),因此 Amount=10 是正确的——若业务要求不同,请进一步明确匹配优先级(如正则、前缀匹配等)。

该方法简洁高效,适用于中等规模数据;对于超大规模数据,可考虑使用 pd.concat + map 或预构建映射字典优化性能。


# pandas  # 字符串  # map  # 多个  # 的是  # 适用于  # 数据处理  # 不含  # 请进  # 不完全  # 仍能  # 为空  # 正确处理 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  EditPlus中的正则表达式 实战(4)  成都网站制作公司哪家好,四川省职工服务网是做什么用?  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  如何用wdcp快速搭建高效网站?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  如何基于云服务器快速搭建网站及云盘系统?  高防服务器如何保障网站安全无虞?  黑客如何通过漏洞一步步攻陷网站服务器?  图册素材网站设计制作软件,图册的导出方式有几种?  想要更高端的建设网站,这些原则一定要坚持!  如何确保西部建站助手FTP传输的安全性?  教你用AI将一段旋律扩展成一首完整的曲子  如何挑选优质建站一级代理提升网站排名?  LinuxCD持续部署教程_自动发布与回滚机制  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何快速完成中国万网建站详细流程?  免费网站制作appp,免费制作app哪个平台好?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何在不使用负向后查找的情况下匹配特定条件前的换行符  如何快速上传建站程序避免常见错误?  简单实现jsp分页  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  如何获取免费开源的自助建站系统源码?  网站优化排名时,需要考虑哪些问题呢?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  魔毅自助建站系统:模板定制与SEO优化一键生成指南  iOS中将个别页面强制横屏其他页面竖屏  Linux安全能力提升路径_长期防护思维说明【指导】  文字头像制作网站推荐软件,醒图能自动配文字吗?  奇安信“盘古石”团队突破 iOS 26.1 提权  网站制作软件免费下载安装,有哪些免费下载的软件网站?  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  教学论文网站制作软件有哪些,写论文用什么软件 ?  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何在万网ECS上快速搭建专属网站?