求助:按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
相关产品推荐
相关产品推荐

