如何基于ID匹配合并两个含学生多ID的Pandas DataFrame?
Pandas多ID匹配合并解决方案
问题场景
现有两个大型Pandas DataFrame:
- DF1:每行存储一名学生的多个ID和对应姓名
- DF2:每行存储一个或多个与DF1匹配的ID,以及对应年级
需要实现两表合并:只要DF2中存在与DF1某行任意ID匹配的项,就将该年级信息对应到DF1的该行。
示例数据
DF1
ID name nfi23, wjm348 sally hji21, arb128 joe mbi13, ybm328 mary
DF2
ID grade nfi23 twelfth arb128, hji21 third mbi13 fourth
期望合并结果
ID name grade nfi23, wjm348 sally twelfth hji21, arb128 joe third mbi13, ybm328 mary fourth
实现代码
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'ID': ['nfi23, wjm348', 'hji21, arb128', 'mbi13, ybm328'], 'name': ['sally', 'joe', 'mary'] }) df2 = pd.DataFrame({ 'ID': ['nfi23', 'arb128, hji21', 'mbi13'], 'grade': ['twelfth', 'third', 'fourth'] }) # 步骤1:拆分DF1的ID并保留原行标识 df1_exploded = df1.assign(ID=df1['ID'].str.split(', ')).explode('ID') df1_exploded['original_ID'] = df1.loc[df1_exploded.index, 'ID'].values # 步骤2:拆分DF2的ID并关联年级 df2_exploded = df2.assign(ID=df2['ID'].str.split(', ')).explode('ID') # 步骤3:按单个ID匹配,获取原DF1行对应的年级 merged = df1_exploded.merge(df2_exploded, on='ID', how='left') grade_mapping = merged.groupby('original_ID')['grade'].first() # 步骤4:合并回原DF1得到最终结果 result = df1.merge(grade_mapping, left_on='ID', right_index=True) print(result)
代码说明
- 拆分展开:用
str.split把逗号分隔的ID拆成列表,再通过explode将每个ID单独成行,同时保留原行的原始ID字符串,确保后续能关联回原数据。 - 匹配关联:以单个ID为匹配键,合并两个展开后的表,获取每个ID对应的年级。
- 聚合回原行:按原行的原始ID分组,提取唯一的年级信息(同一学生的多个ID对应同一个年级),最后合并回原DF1。
- 效率适配:全程使用Pandas矢量化操作,避免循环,适合处理大型数据集。
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

