pandas无唯一标识列时实现df2到df1列映射的问题求解
错误原因分析
- 未显式指定merge关联键:虽然本次数据中仅
participant、Movement_type两个列同名,pandas默认会用这两个列做关联,但隐式关联可读性差,后续列名变动会直接导致逻辑出错。 - 索引对齐风险:单独提取df1的两列做merge操作,得到的结果索引是重新生成的,若df2存在重复的关联键组合导致行膨胀,直接赋值回原df1会出现索引错位,值匹配错误。
- 未过滤无匹配数据:df1中存在df2没有的关联组合(1197+A),左连接后该行
completion_time为NaN,目标结果需要排除这类无匹配的行。
修正方案
方法1:显式关联merge(可读性高)
直接基于完整df1和df2的指定列做关联,过滤无匹配数据即可得到目标结果:
df3 = df1.merge( df2[["participant", "Movement_type", "completion_time"]], on=["participant", "Movement_type"], how="left" ).dropna(subset=["completion_time"]).reset_index(drop=True)
方法2:字典映射(性能更高,适合大表场景)
将df2的关联键和目标值预制成映射字典,直接给df1做列映射:
# 制作多级索引映射字典 completion_map = df2.set_index(["participant", "Movement_type"])["completion_time"].to_dict() # 映射赋值 df1["completion_time"] = df1.set_index(["participant", "Movement_type"]).index.map(completion_map) # 过滤无匹配行得到结果 df3 = df1.dropna(subset=["completion_time"]).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者London-35
相关产品推荐
相关产品推荐

