如何在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
相关产品推荐
相关产品推荐

