如何重构年龄插补代码:用函数提升可读性与代码质量
代码重构:优化泰坦尼克号数据集年龄缺失值填充逻辑
原始代码通过多层嵌套循环处理年龄缺失值,可读性与可维护性较差。以下是通过函数封装、Pandas原生特性优化后的版本,实现相同功能的同时大幅提升代码清晰度:
import numpy as np import pandas as pd def load_data(train_path: str, test_path: str) -> tuple[pd.DataFrame, pd.DataFrame]: """加载训练集与测试集数据""" train_df = pd.read_csv(train_path) test_df = pd.read_csv(test_path) return train_df, test_df def fill_missing_ages(df: pd.DataFrame) -> pd.DataFrame: """按Sex和Pclass分组填充缺失Age值:取分组中位数并调整为0.5的倍数""" # 计算每个(Sex, Pclass)分组的年龄中位数 age_group_medians = df.groupby(['Sex', 'Pclass'])['Age'].median() # 将中位数调整为最近的0.5倍数(与原始逻辑一致) adjusted_medians = age_group_medians.apply(lambda x: int(x / 0.5 + 0.5) * 0.5) # 填充缺失值:匹配对应分组的调整后中位数 df['Age'] = df.apply( lambda row: adjusted_medians.loc[(row['Sex'], row['Pclass'])] if pd.isnull(row['Age']) else row['Age'], axis=1 ) # 转换为整数类型 df['Age'] = df['Age'].astype(int) return df # 主执行逻辑 train_df, test_df = load_data("train_df.csv", "test_df.csv") combine = [train_df, test_df] for df in combine: fill_missing_ages(df)
优化亮点
- 职责拆分:将数据加载、缺失值填充拆分为独立函数,单一职责便于复用与测试
- 消除嵌套循环:用
groupby替代多层循环,直接按Sex+Pclass分组计算,逻辑更直观 - 可读性增强:添加函数文档字符串、清晰的变量命名,代码意图一目了然
- Pandas原生实现:利用
apply+loc完成缺失值匹配填充,符合Pandas惯用写法,减少手动索引出错概率
内容的提问来源于stack exchange,提问作者user14736700
相关产品推荐
相关产品推荐

