pandas根据另一DataFrame的匹配值更新目标列值
问题场景
- 存在两个pandas DataFrame对象
df1、df2,二者均包含Weight in lb(体重,单位:磅)列 - 核心需求:当两个表的
Weight in lb取值匹配时,将df2中对应的BMI值更新到df1的BMI列;因原表结构复杂,禁止使用merge类合并操作 - 样例数据结构:
df1包含6个字段:索引、First Name、Age、Gender、Weight in lb、BMI,初始状态下BMI列全为空值df2包含3个字段:Weight in lb、BMI、Height,存储不同体重对应的BMI参考值
- 待修复的失败代码:
df1['BMI'] = df2.loc[df2['Weight in lb'].isin(df1['Weight in lb'],'BMI']
- 预期输出规则:匹配到对应体重的行正确填充BMI值(如体重167对应BMI17.3、175对应19.6、169对应17.9),未匹配到的体重(如132)对应的BMI保留空值
错误原因
- 语法层面:代码存在括号、引号不闭合问题,
loc索引的语法书写错误,无法正常运行 - 逻辑层面:
isin方法仅判断值是否存在,无法实现两个表按体重值一一对应匹配的效果,直接赋值会因索引不对齐导致值错位
修复方案
使用map方法实现键值对映射填充,无需合并表,不会修改原表结构和行顺序,未匹配到的值默认保留空值,完全适配需求:
# 从df2构建「体重值:BMI值」的映射字典 bmi_mapping = df2.set_index('Weight in lb')['BMI'].to_dict() # 按体重列映射填充BMI df1['BMI'] = df1['Weight in lb'].map(bmi_mapping)
执行后校验结果:体重167、175、169的行分别正确填充17.3、19.6、17.9,体重132等未在df2中存在的行BMI仍为空值,和预期效果完全一致。
内容的提问来源于stack exchange,提问作者user18562240
相关产品推荐
相关产品推荐

