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

如何在Pandas中按精确匹配Name列+部分匹配ID与String列合并DataFrame

解决方案

没问题,这个需求用pandas就能轻松搞定!核心思路是先从df2的String列里提取出对应的ID数字,再和df1基于Name和提取出的ID做精确匹配,具体操作看下面:

1. 先构造示例数据(对应你给出的两个DataFrame)

import pandas as pd

# 第一个DataFrame df1
df1 = pd.DataFrame({
    'Name': ['AAA', 'AAA', 'BBB', 'BBB', 'CCC', 'CCC', 'DDD'],
    'ID': [1111, 1122, 2222, 2211, 3333, 3311, 4444],
    'Tag': ['XYZ', 'DEF', 'PQR', 'MNL', 'STU', 'JKL', 'ABC']
})

# 第二个DataFrame df2
df2 = pd.DataFrame({
    'String': ['aasd1111dasd', 'sdf1122sdf', 'sdffgs2222f', 'fsfg3333sdf', 'sefg4444sdf'],
    'Name': ['AAA', 'AAA', 'BBB', 'CCC', 'DDD']
})

2. 提取df2中的ID并完成合并

# 从String列提取连续数字作为ID,转成整数和df1的ID类型保持一致
df2['ID'] = df2['String'].str.extract(r'(\d+)').astype(int)

# 基于Name和ID做精确匹配合并,用left join确保保留df2的所有行
merged_df = pd.merge(df2, df1, on=['Name', 'ID'], how='left')

# 筛选出需要的列,去掉可能存在的匹配失败行(如果有的话)
result = merged_df[['String', 'Name', 'Tag']].dropna()

3. 查看结果

运行后result就是你想要的格式:

String Name  Tag
0  aasd1111dasd  AAA  XYZ
1    sdf1122sdf  AAA  DEF
2   sdffgs2222f  BBB  PQR
3    fsfg3333sdf  CCC  STU
4    sefg4444sdf  DDD  ABC

补充说明

  • 正则r'(\d+)'用来提取String里的连续数字,刚好对应df1中的ID;如果你的String里有多个数字串,可以根据实际情况调整正则(比如限定数字长度为4位:r'(\d{4})')。
  • astype(int)是为了和df1的ID类型统一,避免因为类型不匹配导致合并失败。
  • how='left'保证df2的所有行都被处理,匹配不上的行会显示NaN,最后用dropna()去掉这些无效行即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:37