基于条件用对应产品均值替换DataFrame中Price列无效值并规避警告
报错原因
你出现SettingWithCopyWarning的核心原因是使用了链式索引df.loc[i]["Price"],这种写法下pandas无法判断你操作的是原始DataFrame还是它的切片视图,因此抛出警告,且赋值操作大概率不会实际生效到原始DataFrame上。
正确实现方案
优先推荐向量化操作,比遍历索引效率更高,也不会触发警告:
# 定义产品均值映射字典 mean_prices_dict = {"Apple": 4.50, "Orange": 5.00, "Banana": 2.00} # 生成每行产品对应的均值 product_mean = df["Product"].map(mean_prices_dict) # 仅替换Price<=0的行,其余行保留原值 df["Price"] = df["Price"].where(df["Price"] > 0, product_mean)
如果需要保留遍历写法,调整.loc的传参方式,将列名作为第二个参数传入,避免链式索引即可:
for i in df[df["Price"] <= 0].index: df.loc[i, "Price"] = mean_prices_dict[df.loc[i, "Product"]]
最终效果
你提供的示例数据执行后输出结果如下:
| ID | Product | Price |
|---|---|---|
| 1 | Apple | 4.50 |
| 2 | Orange | 5.00 |
| 1 | Banana | 2.00 |
| 2 | Apple | 3.99 |
内容的提问来源于stack exchange,提问作者hasan123
相关产品推荐
相关产品推荐

