Pandas中如何用另一DataFrame的匹配值替换当前表的0值
Pandas 双DataFrame条件替换0值实现方法
核心逻辑是通过公共关联键把参考平均值关联到主表,再做向量化条件替换,全程不需要逐行遍历,执行效率高。
具体实现步骤
- 先重命名参考表的统计列,避免合并时字段名冲突
# 给df2的平均值字段加专属后缀,和df1的原始业务字段做区分 df2_ref = df2.rename(columns={"Quantity": "Quantity_mean", "Price": "Price_mean"})
- 按匹配规则把平均值关联到df1
用Region和Product作为联合关联键,用左连接保证df1的原始行数、顺序完全不变,每一行自动匹配到同区域同产品的平均值:
df_combined = df1.merge(df2_ref, on=["Region", "Product"], how="left")
- 执行条件替换
只把取值为0的Quantity、Price替换成对应平均值,非0值保留原始数据:
import numpy as np # 替换数量字段的0值 df_combined["Quantity"] = np.where( df_combined["Quantity"] == 0, df_combined["Quantity_mean"], df_combined["Quantity"] ) # 替换价格字段的0值 df_combined["Price"] = np.where( df_combined["Price"] == 0, df_combined["Price_mean"], df_combined["Price"] )
- 清理临时冗余字段,得到最终结果
df1_final = df_combined.drop(columns=["Quantity_mean", "Price_mean"])
注意事项
- 提前确认df2中每个
Region+Product组合是唯一的,不存在重复统计行,否则合并时会出现主表行数膨胀的问题 - 如果你的数据里0值是缺失值填充来的,可以把判断条件改成同时兼容空值:
df_combined["Quantity"].isna() | (df_combined["Quantity"] == 0),空值也会一并替换成平均值 - 你提到的南非地区XYZ产品0值替换的场景,因为南非属于非洲区域,合并时会自动匹配到df2中非洲区域XYZ产品的平均值,完全符合替换规则
内容的提问来源于stack exchange,提问作者A.N.
相关产品推荐
相关产品推荐

