pandas如何基于ID关联表从另一DataFrame匹配映射对应数据
实现方法
直接通过pandas内连接即可完成需求,无需额外循环或自定义映射逻辑:
- 内连接会自动过滤掉ID映射表中不存在的
id_2=30记录 - 映射表中同一个
id_2对应多个id_1时,连接操作会自动将该id_2下的所有业务记录分别匹配到每个id_1上 - 提前对业务表做去重,避免完全重复的业务记录生成多余的关联结果
完整代码
import pandas as pd # --------------- 以下是示例数据构造,你已有数据可直接跳过 --------------- df_related_id = pd.DataFrame({ 'id_1': [1, 2, 3, 4], 'id_2': [10, 10, 10, 5] }) df_2 = pd.DataFrame({ 'id_2': [10, 10, 10, 5, 5, 30], 'date': ['2017-12-31', '2017-12-31', '2017-12-31', '2017-11-30', '2017-11-30', '2017-12-31'], 'hour': ['6:00', '6:15', '6:00', '6:00', '6:00', '6:00'], 'val': [-1, 12, -1, 11, 11, 14] }) # -------------------------------------------------------------------- # 核心处理流程 # 1. 去除业务表中完全重复的记录 df_2_unique = df_2.drop_duplicates(subset=['id_2', 'date', 'hour', 'val']) # 2. 以id_2为键做内连接关联 merge_result = pd.merge(df_related_id, df_2_unique, on='id_2', how='inner') # 3. 筛选目标字段、排序后重置索引 final_result = merge_result[['id_1', 'date', 'hour', 'val']].sort_values('id_1').reset_index(drop=True)
运行结果
执行print(final_result)即可得到和预期完全一致的输出:
id_1 date hour val 0 1 2017-12-31 6:00 -1 1 1 2017-12-31 6:15 12 2 2 2017-12-31 6:00 -1 3 2 2017-12-31 6:15 12 4 3 2017-12-31 6:00 -1 5 3 2017-12-31 6:15 12 6 4 2017-11-30 6:00 11
注:原示例中
2017-11-31为非法日期(11月共30天),代码中修正为2017-11-30,实际使用时替换为你的真实日期值即可。
内容的提问来源于stack exchange,提问作者Mostafa Alaverdi
相关产品推荐
相关产品推荐

