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

如何在不同尺寸的Pandas DataFrame中匹配子串并关联结果?

高效实现Pandas DataFrame间的子串匹配关联

问题描述

现有两个尺寸不同的Pandas DataFrame(FrameA行数更少),需为FrameA的A列每个元素,找到FrameB的A列中包含该子串的对应元素,并在FrameA中新增一列存储匹配结果。此前尝试np.where因尺寸不匹配失效,用for循环实现效率极低,需更优雅高效的方案。

示例代码

import pandas as pd

FrameA = pd.DataFrame({
    "A": ["00281378554", "10862520000", "82540193700", "76015394900", "00134355050", "21864009"]
})

FrameB = pd.DataFrame({
    "A": [
        "AT511634000134355050", "AT411513000281378554", "AT711509100151013992",
        "AT511509000121340020", "AT424480010862520000", "AT742011182540193700",
        "AT531200076015394900", "HU02142201082186400900000000"
    ]
})

高效解决方案

利用Pandas的矢量化字符串方法结合apply实现,避免显式循环,大幅提升效率:

# 定义匹配函数:针对FrameA的每个元素,找到FrameB中包含该子串的第一个匹配项
def find_match(x):
    matches = FrameB[FrameB['A'].str.contains(x)]['A']
    return matches.iloc[0] if not matches.empty else None

# 新增Col B列存储匹配结果
FrameA['Col B'] = FrameA['A'].apply(find_match)

优化说明

  • str.contains是Pandas内置的矢量化操作,底层基于C实现,比Python原生循环效率高数倍
  • 因FrameA行数更少,apply仅对少量元素调用匹配函数,计算量可控
  • 若存在多个匹配项,上述代码取第一个结果;若需返回所有匹配项,可修改为return matches.tolist()

结果验证

执行后FrameA的输出结果如下:

Col ACol B
00281378554AT411513000281378554
10862520000AT424480010862520000
82540193700AT742011182540193700
76015394900AT531200076015394900
00134355050AT511634000134355050
21864009HU02142201082186400900000000

内容的提问来源于stack exchange,提问作者SMS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:53:15