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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:54:20