Pandas填充汽车数据集价格列品牌中位值报错及fillna不生效问题
问题原因
- replace报错原因:pandas的
Series.replace()方法不支持同时指定非None的to_replace值(此处为np.nan)和字典/Series类型的替换值,你预计算的med_price是索引为品牌名的Series,不符合该方法的参数规则,因此抛出ValueError。 - fillna不生效原因:
- 你没有添加
inplace=True参数,也没有将fillna()的返回结果赋值回car['price'],pandas默认不会修改原数据,只会返回修改后的新对象; - 即使添加了
inplace=True也不会生效:med_price的索引是汽车品牌名,而car['price']的索引是数字行号,二者索引无法对齐,因此找不到对应填充值。
- 你没有添加
- 中位数计算逻辑错误:你原逻辑中先把
?替换为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
相关产品推荐
相关产品推荐

