跳到主要内容

数据处理

问题

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: 如何处理不平衡数据?

答案

  1. 过采样:SMOTE 生成少数类样本
  2. 欠采样:随机减少多数类
  3. 类权重class_weight="balanced"
  4. 评估指标:用 F1-score、AUC 代替 accuracy

相关链接