如何在不同尺寸的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 A | Col B |
|---|---|
| 00281378554 | AT411513000281378554 |
| 10862520000 | AT424480010862520000 |
| 82540193700 | AT742011182540193700 |
| 76015394900 | AT531200076015394900 |
| 00134355050 | AT511634000134355050 |
| 21864009 | HU02142201082186400900000000 |
内容的提问来源于stack exchange,提问作者SMS
相关产品推荐
相关产品推荐

