如何对含分隔符的列执行Pandas合并(类似Vlookup)?
解决Pandas合并含多值单元格的问题
问题分析
原代码直接用merge无法匹配的核心原因是:df2的PDs列存在分号分隔的多值字符串,而df1的PDs均为单个值,两者无法直接匹配。必须先将df2的多值PDs拆分为单独行,再执行合并操作。
解决方案
先拆分df2中PDs列的多值并展开为多行(保留对应Number),再与df1做合并:
import pandas as pd # 读取Excel数据 df1 = pd.read_excel('df1.xlsx') df2 = pd.read_excel('df2.xlsx') # 处理df2:拆分多值PDs并展开为多行,同时清理空格 df2_processed = df2.assign(PDs=df2['PDs'].str.split(';')).explode('PDs') df2_processed['PDs'] = df2_processed['PDs'].str.strip() # 执行合并 dfmerge = df1.merge(df2_processed[['Number', 'PDs']], on='PDs')
代码说明
df2['PDs'].str.split(';'):把每个PDs单元格的字符串按分号拆分为列表(比如"9045;4729;5392"会变成['9045', '4729', '5392'])。.explode('PDs'):将列表中的每个元素单独展开为一行,原行的Number会对应每个拆分后的PDs值。.str.strip():去除PDs值前后的空格,避免因单元格内的空格(比如"9045; 4729")导致匹配失败。- 最后用处理后的df2子集与df1合并,即可实现单个PDs值和多值拆分后的匹配。
示例验证
针对你给出的df2示例数据:
| row | PDs |
|---|---|
| 0 | 2345 |
| 1 | 2675 |
| 2 | 8706 |
| 3 | 9045;4729;5392 |
| 4 | 3452 |
处理后df2_processed的PDs列会变为:
| PDs | Number |
|---|---|
| 2345 | 原行对应Number |
| 2675 | 原行对应Number |
| 8706 | 原行对应Number |
| 9045 | 原行3对应Number |
| 4729 | 原行3对应Number |
| 5392 | 原行3对应Number |
| 3452 | 原行对应Number |
此时再与df1合并,就能正确匹配所有PDs值。
内容的提问来源于stack exchange,提问作者Drex
相关产品推荐
相关产品推荐

