基于month列及ref字段匹配两个DataFrame实现值映射的Pythonic方法
Pythonic高性能实现方案
推荐直接使用Pandas原生的宽表转换+关联逻辑,全程无自定义循环,性能远高于嵌套循环、列表推导或apply类实现,代码易维护:
import pandas as pd # 1. 将宽表df_A转换为长表,对齐df_B的关联字段格式 df_A_long = df_A.melt( id_vars="month", # 保留month作为关联键 var_name="ref", # 原df_A的列名转为ref字段,匹配df_B的ref列 value_name="result" # 原df_A的列值转为result字段,直接对应目标列 ) # 2. 双字段关联直接得到结果,默认左关联保留df_B所有行 df_B = df_B.merge(df_A_long, on=["month", "ref"], how="left")
如果需要保留df_B原有的行顺序和索引,可以用以下写法:
df_B = ( df_B.reset_index() .merge(df_A_long, on=["month", "ref"], how="left", sort=False) .set_index("index") .sort_index() )
小数据量备选方案
如果df_A数据量很小,也可以用嵌套字典映射的方式实现,代码更简洁但性能略低于上述向量化方案:
# 构建 month -> {ref: value} 的嵌套映射字典 month_ref_map = df_A.set_index("month").to_dict("index") # 逐行映射得到结果 df_B["result"] = df_B.apply( lambda x: month_ref_map.get(x["month"], {}).get(x["ref"], pd.NA), axis=1 )
内容的提问来源于stack exchange,提问作者user16796559
相关产品推荐
相关产品推荐

