数据处理
问题
Python 数据处理的常见流程有哪些?如何做缺失值处理和特征工程?
答案
ETL 流程
缺失值处理策略
import pandas as pd
import numpy as np
df = pd.DataFrame({
"age": [25, np.nan, 35, 40, np.nan],
"salary": [50000, 60000, np.nan, 80000, 90000],
"city": ["北京", "上海", None, "广州", "深圳"],
})
# 1. 删除(适用于缺失比例小)
df.dropna(thresh=2) # 非空值至少 2 个才保留
# 2. 填充——数值用中位数/均值
df["age"].fillna(df["age"].median(), inplace=True)
# 3. 填充——分类用众数
df["city"].fillna(df["city"].mode()[0], inplace=True)
# 4. 前向/后向填充(时序数据)
df["salary"].ffill() # 用前一行填充
df["salary"].bfill() # 用后一行填充
# 5. 插值
df["salary"].interpolate(method="linear")
异常值检测
# IQR 方法
Q1 = df["salary"].quantile(0.25)
Q3 = df["salary"].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df["salary"] < lower) | (df["salary"] > upper)]
# Z-Score 方法
from scipy import stats
z_scores = np.abs(stats.zscore(df["salary"].dropna()))
outliers = df[z_scores > 3] # 超过 3 个标准差
特征工程
# 独热编码
df_encoded = pd.get_dummies(df, columns=["city"], prefix="city")
# 标签编码
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df["city_code"] = le.fit_transform(df["city"])
# 标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df[["age", "salary"]] = scaler.fit_transform(df[["age", "salary"]])
# 分箱
df["age_group"] = pd.cut(df["age"], bins=[0, 25, 35, 50, 100], labels=["青年", "中青年", "中年", "老年"])
常见面试问题
Q1: 缺失值处理策略怎么选?
答案:
| 缺失比例 | 策略 |
|---|---|
| < 5% | 删除或简单填充 |
| 5%-30% | 均值/中位数/模型填充 |
| > 30% | 考虑删除该列,或作为新特征 |
Q2: 独热编码和标签编码怎么选?
答案:
- 独热编码:类别间无序关系(如城市、颜色)。缺点:高基数会维度爆炸
- 标签编码:类别间有序关系(如学历:小学=1、中学=2、大学=3)
- 目标编码(Target Encoding):用目标变量的均值替代类别,适合高基数
Q3: 如何处理不平衡数据?
答案:
- 过采样:SMOTE 生成少数类样本
- 欠采样:随机减少多数类
- 类权重:
class_weight="balanced" - 评估指标:用 F1-score、AUC 代替 accuracy