You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas填充汽车数据集价格列品牌中位值报错及fillna不生效问题

问题原因

  1. replace报错原因:pandas的Series.replace()方法不支持同时指定非None的to_replace值(此处为np.nan)和字典/Series类型的替换值,你预计算的med_price是索引为品牌名的Series,不符合该方法的参数规则,因此抛出ValueError。
  2. fillna不生效原因:
    • 你没有添加inplace=True参数,也没有将fillna()的返回结果赋值回car['price'],pandas默认不会修改原数据,只会返回修改后的新对象;
    • 即使添加了inplace=True也不会生效:med_price的索引是汽车品牌名,而car['price']的索引是数字行号,二者索引无法对齐,因此找不到对应填充值。
  3. 中位数计算逻辑错误:你原逻辑中先把?替换为0再计算分组中位数,0会被当作有效数值参与中位数计算,得到的中位数值本身不准确。

正确实现方案

推荐直接用pd.to_numeric处理缺失值,配合分组transform填充,代码更简洁,结果也更准确:

import numpy as np
import pandas as pd

# 1. 直接将price列转数值类型,无法转换的'?'自动转为NaN,无需中间转0的步骤,计算中位数时会自动忽略空值
car['price'] = pd.to_numeric(car['price'], errors='coerce')

# 2. 按品牌分组,用对应品牌的价格中位数填充空值,transform会自动对齐原数据行索引
car['price'] = car['price'].fillna(car.groupby('make')['price'].transform('median'))

如果要沿用你预计算中位数的逻辑,可调整为按品牌匹配填充:

# 先将?转为NaN,避免0参与中位数计算
car['price'] = car['price'].replace('?', np.nan).astype(float)
# 计算中位数时自动忽略空值
med_price = car.groupby('make')['price'].median()
# 按品牌匹配填充空值
car.loc[car['price'].isna(), 'price'] = car.loc[car['price'].isna(), 'make'].map(med_price)

内容的提问来源于stack exchange,提问作者Ankur Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:18:03