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

如何在Pandas中基于数字匹配两组名称并生成展开结果

解决Pandas中基于数字集合匹配并展开名称的问题

步骤说明

要实现基于number_b和number_s的交集匹配并展开所有结果,核心是先将集合格式的数字字段拆分成单个数字条目,再通过关联匹配得到所有组合,最后处理无匹配的情况。

完整代码实现

import pandas as pd

# 1. 构造输入数据集(实际场景可替换为pd.read_csv等读取方式)
data = {
    'Entity': [1, 1, 1, 1, 1],
    'name_b': ['Zyla', 'Zyla 620', 'Xyla 620', 'GCP Zyla', 'Zy'],
    'number_b': ['{1, 2, 3}', '{1}', '{2}', '{4, 7}', '{103}'],
    'name_s': ['Zeela', 'Zylo', 'Xylaa', 'Ann Zyl', None],
    'number_s': ['{1, 2, 3}', '{1}', '{2}', '{103}', None]
}
df = pd.DataFrame(data)

# 2. 处理name_b组:拆分数字集合并展开为单行单数字
df_b = df[['Entity', 'name_b', 'number_b']].dropna(subset=['number_b'])
# 解析"{x,y,z}"格式的字符串为整数列表
df_b['number'] = df_b['number_b'].str.strip('{}').str.split(', ').apply(lambda x: [int(i) for i in x])
# 展开列表为多行,每个数字对应一行
df_b = df_b.explode('number').drop(columns=['number_b'])

# 3. 处理name_s组:同样拆分数字集合并展开
df_s = df[['Entity', 'name_s', 'number_s']].dropna(subset=['number_s'])
df_s['number'] = df_s['number_s'].str.strip('{}').str.split(', ').apply(lambda x: [int(i) for i in x])
df_s = df_s.explode('number').drop(columns=['number_s'])

# 4. 左连接匹配:保留所有name_b的条目,无匹配时name_s填充'-'
result = df_b.merge(df_s, on=['Entity', 'number'], how='left')
result['name_s'] = result['name_s'].fillna('-')

# 5. 调整列顺序并重置索引
result = result[['Entity', 'number', 'name_b', 'name_s']].reset_index(drop=True)

print(result)

代码解释

  • 数字解析与展开:通过str.strip去掉集合的大括号,str.split拆分数字字符串,再转成整数列表,最后用explode将列表展开为多行,实现每个数字对应一条记录。
  • 左连接匹配:使用merge的左连接方式,确保所有name_b的数字条目都被保留,匹配不到对应name_s的条目会自动填充NaN,后续用fillna替换为'-'。
  • 列顺序调整:最后调整列的顺序,与期望输出格式保持一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 16:43:21