Pandas 2.2 数据清洗实战3步处理 Titanic 数据集 1000 行缺失值数据清洗是机器学习项目中最耗时但至关重要的环节。一个典型的真实数据集往往包含大量缺失值、异常数据和格式问题直接使用原始数据训练模型会导致严重偏差。本文将使用 Pandas 2.2 最新特性通过 Titanic 数据集演示工业级数据清洗全流程。1. 环境准备与数据加载首先确保安装最新版 Pandas 2.2其性能优化对大数据集处理至关重要pip install pandas2.2.0 numpy scikit-learn加载 Titanic 数据集时建议直接从可靠源获取原始数据以避免版本差异。这里使用 Seaborn 内置数据集作为示例import pandas as pd import seaborn as sns # 加载数据集 df sns.load_dataset(titanic) # 查看数据概览 print(f数据集形状: {df.shape}) print(\n前5行数据:) display(df.head())输出显示数据集包含 891 行乘客记录12 个特征列。关键特征包括数值型age年龄、fare票价类别型sex性别、embarked登船港口混合型cabin舱位含字母和数字提示实际项目中应优先检查数据字典明确每个字段的业务含义。例如 Titanic 数据中 pclass 表示客舱等级1头等舱而非简单的数值标签。2. 缺失值诊断与处理策略2.1 系统性缺失分析使用 Pandas 2.2 增强的缺失值分析功能# 计算各列缺失率 missing_stats pd.concat([ df.isnull().sum().rename(缺失数量), (df.isnull().mean()*100).rename(缺失率(%)) ], axis1) # 过滤存在缺失的列 missing_stats missing_stats[missing_stats[缺失数量] 0] print(缺失值统计报告:) display(missing_stats.sort_values(缺失率(%), ascendingFalse))典型输出显示cabin77%缺失属于高缺失率字段age20%缺失中等缺失率embarked0.2%缺失极低缺失率2.2 分类型缺失处理方案针对不同缺失模式采取差异化策略高缺失率字段cabin# 方案1直接删除当该字段非关键特征时 df df.drop(columns[cabin]) # 方案2标记缺失当需要保留信息时 # df[cabin_missing] df[cabin].isnull().astype(int)中等缺失率字段age# 使用随机森林预测缺失年龄需先处理其他缺失 from sklearn.ensemble import RandomForestRegressor # 准备特征矩阵 age_features df[[pclass, sex, sibsp, parch, fare]] age_features pd.get_dummies(age_features) # 分割已知/未知年龄数据 known_age age_features[df[age].notnull()] unknown_age age_features[df[age].isnull()] y df[age].dropna() # 训练预测模型 rfr RandomForestRegressor(random_state42) rfr.fit(known_age, y) predicted_age rfr.predict(unknown_age) # 填充缺失值 df.loc[df[age].isnull(), age] predicted_age低缺失率字段embarked# 直接使用众数填充 df[embarked] df[embarked].fillna(df[embarked].mode()[0])3. 数据类型转换与特征工程3.1 自动类型优化Pandas 2.2 引入更高效的数据类型# 查看当前数据类型 print(\n原始数据类型:) print(df.dtypes) # 自动转换优化 df df.convert_dtypes() print(\n优化后数据类型:) print(df.dtypes)3.2 关键特征工程创建有助于预测的新特征# 家庭规模家庭成员总数 df[family_size] df[sibsp] df[parch] 1 # 票价分层基于分位数 df[fare_category] pd.qcut(df[fare], q4, labels[low, medium, high, very_high]) # 年龄分组 df[age_group] pd.cut(df[age], bins[0, 12, 18, 60, 100], labels[child, teen, adult, senior])3.3 类别变量编码# 有序类别编码如客舱等级 df[pclass] df[pclass].astype(category) # 无序类别独热编码 df pd.get_dummies(df, columns[sex, embarked, fare_category], drop_firstTrue)4. 数据质量验证与输出4.1 清洗后验证# 检查缺失值 assert df.isnull().sum().sum() 0, 存在未处理的缺失值 # 检查异常值 Q1 df[fare].quantile(0.25) Q3 df[fare].quantile(0.75) IQR Q3 - Q1 lower_bound Q1 - 1.5*IQR upper_bound Q3 1.5*IQR outliers df[(df[fare] lower_bound) | (df[fare] upper_bound)] print(f\n检测到票价异常值数量: {len(outliers)}) # 处理异常值示例缩尾处理 df[fare] df[fare].clip(lower_bound, upper_bound)4.2 最终数据输出# 保存清洗后数据 df.to_csv(titanic_cleaned.csv, indexFalse) # 数据结构概览 print(\n最终数据结构:) print(f行数: {len(df)}, 列数: {len(df.columns)}) print(示例数据:) display(df.iloc[:3, :5])通过这3个核心步骤我们完成了系统性缺失值诊断与智能填充自动化类型优化与特征增强全面数据质量验证与输出实际项目中建议将上述流程封装为可复用的数据管道Pipeline特别是在处理实时数据流时。Pandas 2.2 的链式方法method chaining特性非常适合这种场景# 链式处理示例 processed_df ( df.pipe(handle_missing_values) .pipe(optimize_data_types) .pipe(generate_features) .pipe(validate_quality) )