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

求助:按car_model分组用中位数填充engine_capacity列NA值失败

问题排查与解决方法

原代码存在的问题

  • 遍历赋值无效:itertuples返回的是只读元组对象,修改循环变量i不会同步到原nancap数据框中,这是代码不生效的核心原因。
  • NaN判断逻辑错误:用i.is_integer() == False识别NA值完全不合理——真正的NaN调用is_integer()会报错,且像2000.0这类整数型浮点数会被误判为非NA值,正确的NA判断应该用pd.isna()。
  • 嵌套循环效率极低:双重循环遍历数据框的写法完全违背Pandas的向量化操作思路,数据量较大时性能会严重下降。

正确实现方案

方法一:使用groupby+transform(推荐)

通过Pandas原生的分组转换API完成填充,简洁高效:

import pandas as pd

url = 'https://raw.githubusercontent.com/YousefAlotaibi/saudi_used_cars_price_prediciton/main/data/cars_cleaned_data.csv'
df = pd.read_csv(url)

# 按car_model分组,用组内中位数填充engine_capacity的NA值
df['engine_capacity'] = df.groupby('car_model')['engine_capacity'].transform(
    lambda x: x.fillna(x.median())
)

# 基于修改后的原数据框生成目标nancap
nancap = df[['engine_capacity', 'car_model']]

方法二:使用映射字典匹配填充

先构建车型与中位数的映射关系,再针对性填充NA值:

import pandas as pd

url = 'https://raw.githubusercontent.com/YousefAlotaibi/saudi_used_cars_price_prediciton/main/data/cars_cleaned_data.csv'
df = pd.read_csv(url)

# 生成car_model对应engine_capacity中位数的字典
cap_median_map = df.groupby('car_model')['engine_capacity'].median().to_dict()

# 对engine_capacity的NA值,替换为对应车型的中位数
df['engine_capacity'] = df.apply(
    lambda row: cap_median_map[row['car_model']] if pd.isna(row['engine_capacity']) else row['engine_capacity'],
    axis=1
)

nancap = df[['engine_capacity', 'car_model']]

关键说明

  • 优先选择方法一,transform是Pandas专为分组后逐行处理设计的API,性能远高于循环遍历。
  • 所有操作直接在原数据框df上修改后再提取nancap,避免数据分离导致的同步问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:06:23