如何使用Pandas基于同行另一列值替换指定列的NaN值?
车辆数据集cylinders列分组中位数缺失值填充实现方案
以下是可直接落地的Python实现,基于pandas完成,覆盖「按车辆类型匹配对应cylinders中位数填充空值」的逻辑,提供两种实现路径可选:
方案1:向量化填充(生产环境首选,性能最优)
不需要写逐行循环,pandas原生的映射填充逻辑比手动遍历快10~100倍,适配十万级以上的大数据集:
import pandas as pd # 1. 加载本地车辆数据集,替换为你的实际文件路径 df = pd.read_csv("vehicle_data.csv") # 2. 生成分组中位数映射:如果你已经从透视表拿到了各车型的cylinders中位数,直接手动写这个字典即可 # 示例:cyl_median_map = {"sedan": 4, "SUV": 6, "truck": 8, "hatchback":4, "van":6} cyl_median_map = df.groupby("type")["cylinders"].median().to_dict() # 3. 执行缺失值填充:自动按每行的车辆类型匹配对应中位数填充NaN df["cylinders"] = df["cylinders"].fillna(df["type"].map(cyl_median_map)) # 4. 兜底逻辑:如果存在某类车辆无有效cylinders统计值,用全量数据集的cylinders中位数填充,避免残留空值 df["cylinders"] = df["cylinders"].fillna(df["cylinders"].median()) # 可选:气缸数为整数值,填充完成后转整型消除浮点数后缀 df["cylinders"] = df["cylinders"].astype(int)
方案2:逐行遍历实现(完全匹配逐行处理逻辑要求)
如果业务规则要求必须逐行校验、逐行处理,可使用遍历方式实现,注意数据集超过10万行时执行速度会明显变慢:
import pandas as pd df = pd.read_csv("vehicle_data.csv") # 替换为你从透视表得到的各车型cylinders中位数映射 cyl_median_map = df.groupby("type")["cylinders"].median().to_dict() fallback_median = df["cylinders"].median() # 逐行遍历判断并填充 for index, row in df.iterrows(): # 识别当前行cylinders是否为空值 if pd.isna(row["cylinders"]): current_car_type = row["type"] # 匹配对应车型的中位数,匹配失败则用全局中位数兜底 fill_value = cyl_median_map.get(current_car_type, fallback_median) df.loc[index, "cylinders"] = fill_value # 同样可选转整型 df["cylinders"] = df["cylinders"].astype(int)
校验方式
填充完成后执行以下代码,返回值为0即代表所有cylinders空值已处理完成:
print(df["cylinders"].isna().sum())
注意事项
- 如果你已经提前通过透视表计算好了各车型的cylinders中位数,不需要再执行groupby计算,直接把统计结果整理成
{车型: 中位数值}格式的字典赋值给cyl_median_map即可 - 若你的数据集里车辆类型、气缸数字段名和示例代码不一致,把代码里对应的字段名替换成实际字段名即可
- 不建议在生产环境优先用逐行遍历方案,pandas的向量化操作经过C层优化,性能远高于Python层的循环逻辑
内容的提问来源于stack exchange,提问作者user19453678
相关产品推荐
相关产品推荐

