如何匹配含多值列的DataFrame双列条件为另一DataFrame新增列
解决方法
核心思路
- 先处理df1的B列多值问题:将逗号分隔的字符串拆分为列表,同时清除每个元素前后的多余空格,再通过
explode方法把列表拆分为独立行,处理后df1每行B列仅存单个值 - 再通过A、B双列等值匹配合并两个DataFrame,提取需要的C、D列即可
完整实现代码
import pandas as pd # 构造示例df1 df1 = pd.DataFrame({ 'A': ['a1','a1','a2','a2','a2','a3','a4','a4','a5'], 'B': ['b1','b2,b3','b3','b2','b4,b1,b5','b4','b5','b6, b2','b6'], 'C': ['c1','c2','c3','c8','c4','c5','c6','c1','c2'], 'D': ['d3','d4','d5','d6','d7','d3','d1','d2','d7'], 'E': ['e1','e2','e3','e1','e2','e4','e5','e1','e2'] }) # 构造示例df2 df2 = pd.DataFrame({ 'A': ['a1','a4','a2','a4'], 'B': ['b1','b6','b1','b2'] }) # 预处理df1,拆分B列多值为单行 df1_processed = df1.assign( B = df1['B'].apply(lambda x: [i.strip() for i in x.split(',')]) ).explode('B') # 双列匹配合并,得到结果 result = df2.merge( df1_processed[['A', 'B', 'C', 'D']], on=['A', 'B'], how='left' ) print(result)
输出结果
A B C D 0 a1 b1 c1 d3 1 a4 b6 c1 d2 2 a2 b1 c4 d7 3 a4 b2 c1 d2
注意事项
如果df1中存在多个满足A相等且B包含对应值的行,上述代码会返回所有匹配结果;如果仅需要第一条匹配结果,可在预处理df1时增加去重逻辑:
df1_processed = df1_processed.drop_duplicates(subset=['A', 'B'], keep='first')
内容的提问来源于stack exchange,提问作者Shraddha Avasthy
相关产品推荐
相关产品推荐

