实操代码速查 — 数据处理与建模

1.1 数据处理(25分) · 2.1 特征工程(15分) · 2.2 模型训练(20分)

必考 (出现 4-5 次) 高频 (出现 2-3 次) 常考 (出现 1 次)
1.1 数据处理 25 分
读取 CSV 必考 5/5 变体
点击展开 ▾
# 基本读取 data = pd.read_csv("文件名.csv") # 指定编码 data = pd.read_csv("文件名.csv", encoding="gbk")
读取CSV文件;encoding='gbk' 用于中文编码文件
显示前N行 必考 5/5 变体
点击展开 ▾
data.head() # 默认前5行 data.head(10) # 前10行
查看数据表的前几行,快速了解数据结构
保存 CSV 必考 5/5 变体
点击展开 ▾
data.to_csv("文件名.csv", index=False)
保存为CSV;index=False 不保存索引列(几乎每次都要写)
统计分类数量 必考 4/5 变体
点击展开 ▾
data['列名'].value_counts()
统计某列中每个不同值出现的次数
分组统计 必考 5/5 变体
点击展开 ▾
# 分组 + 单一聚合 data.groupby('列名1')['列名2'].mean() # 分组 + 多种聚合 data.groupby('列名1')['列名2'].agg(['count', 'mean']) # 分组 + 自定义计算 data.groupby('列名1')['列名2'].apply(lambda x: (x == '某值').mean()) # 分组 + 透视展开 data.groupby(['列名1','列名2'])['列名3'].mean().unstack()
按某列分组后对另一列做聚合运算
数值分段 必考 3/5 变体
点击展开 ▾
bins = [0, 18.5, 24, 28, np.inf] labels = ['偏瘦', '正常', '超重', '肥胖'] data['新列'] = pd.cut(data['数值列'], bins=bins, labels=labels, right=False)
将连续数值按区间分段;right=False 左闭右开区间
条件分类 必考 3/5 变体
点击展开 ▾
data['新列'] = np.where(data['列名'] > 7, '高风险', '低风险')
条件为True返回第二个值,False返回第三个值
删除空值 必考 4/5 变体
点击展开 ▾
data = data.dropna() # 删除所有含空值的行 data = data.dropna(subset=['列名']) # 只看某列的空值
删除包含空值的行
检查空值 必考 4/5 变体
点击展开 ▾
data.isnull().sum() # 每列空值数量(注意 isnull 后面有括号!)
统计每列有多少个空值。⚠️ isnull() 必须带括号
范围判断 必考 3/5 变体
点击展开 ▾
data['Age'].between(18, 70) # 常用于异常值筛选 data = data[data['Age'].between(18, 70) & data['Score'].between(1, 5)]
判断数值是否在指定范围内,返回True/False
数据类型转换 高频 2/5 变体
点击展开 ▾
data['列名'] = data['列名'].astype(int) data['列名'] = data['列名'].astype(float)
转换列的数据类型,如字符串转整数
手动标准化 高频 2/5 变体
点击展开 ▾
data['列名'] = (data['列名'] - data['列名'].mean()) / data['列名'].std()
Z-score标准化:(值 - 均值) / 标准差
填充空值 高频 2/5 变体
点击展开 ▾
# 前向/后向填充 data['列名'].fillna(method='ffill', inplace=True) # 用前一个值填充 data['列名'].fillna(method='bfill', inplace=True) # 用后一个值填充 # 用众数填充(每列各自填充) data = data.apply(lambda x: x.fillna(x.mode()[0]))
用不同策略填充空值:前向填充、后向填充、众数填充
筛选数据 常考 1/5 变体
点击展开 ▾
data[data['列名'].isin(['值1', '值2'])]
保留列值在给定列表中的行
重复值处理 高频 2/5 变体
点击展开 ▾
# 检查重复 data.duplicated().sum() # 删除重复 data.drop_duplicates(inplace=True)
检查/删除重复行。⚠️ 是 drop_duplicates 不是 drop_dumplicates
删除列 高频 2/5 变体
点击展开 ▾
data.drop(columns=['列名1', '列名2']) data.drop(columns=['列名'], inplace=True)
删除指定列
获取行数 高频 2/5 变体
点击展开 ▾
len(data) # 总行数 data.shape[0] # 行数(0=行,1=列)
获取数据表的行数
2.1 特征工程 15 分
标准化 必考 4/5 变体
点击展开 ▾
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data[列名列表] = scaler.fit_transform(data[列名列表]) # 例:标准化后均值为0,标准差为1
Z-score标准化(均值0,标准差1)
归一化 必考 3/5 变体
点击展开 ▾
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() data[列名列表] = scaler.fit_transform(data[列名列表]) # 归一化到 [0, 1] 区间
归一化到 [0,1] 区间
划分数据集 必考 5/5 变体
点击展开 ▾
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
划分训练集和测试集;test_size=0.2 表示测试集占20%
检查空值 + 删除 必考 5/5 变体
点击展开 ▾
# 检查 print(data.isnull().sum()) # 删除 data = data.dropna()
先检查每列空值数量,再删除含空值的行
读取 Excel 高频 2/5 变体
点击展开 ▾
data = pd.read_excel("文件名.xlsx")
读取Excel文件(注意和 read_csv 区分)
转数值类型 高频 2/5 变体
点击展开 ▾
data['列名'] = pd.to_numeric(data['列名'], errors='coerce') # errors='coerce' → 转不了的变 NaN,而不是报错
转换为数字类型;errors='coerce' 让异常值变成空值而非报错
删除重复值 高频 3/5 变体
点击展开 ▾
duplicates = data.duplicated() num_dup = duplicates.sum() data = data[~duplicates] # 或者 data.drop_duplicates(inplace=True)
检查并删除重复行
IQR 异常值处理 高频 1/5 变体
点击展开 ▾
Q1 = data['列名'].quantile(0.25) Q3 = data['列名'].quantile(0.75) IQR = Q3 - Q1 data_cleaned = data[~((data['列名'] < (Q1 - 1.5 * IQR)) | (data['列名'] > (Q3 + 1.5 * IQR)))]
用四分位距剔除异常值:踢掉 Q1-1.5×IQR 到 Q3+1.5×IQR 范围外的数据
标签编码 常考 1/5 变体
点击展开 ▾
from sklearn.preprocessing import LabelEncoder data['列名'] = LabelEncoder().fit_transform(data['列名'])
把文字分类(如"高/中/低")转成数字(2/1/0)
合并数据集 常考 1/5 变体
点击展开 ▾
cleaned_data = pd.concat([X, y], axis=1) # axis=1 按列合并,axis=0 按行合并
合并数据;axis=1 按列(左右拼接),axis=0 按行(上下拼接)
修改列名 常考 1/5 变体
点击展开 ▾
data.rename(columns={'原名': '新名'}, inplace=True)
重命名列
日期处理 常考 1/5 变体
点击展开 ▾
data['日期列'] = pd.to_datetime(data['日期列']) # 计算天数差 data['天数差'] = (data['日期A'] - data['日期B']).dt.days
转为日期类型后可以用 .dt.days 提取天数差
清理列名空格 常考 2/5 变体
点击展开 ▾
data.columns = data.columns.str.strip()
去除列名首尾空格,避免因空格导致列名匹配失败
查看数据信息 高频 3/5 变体
点击展开 ▾
data.info() # 表结构、数据类型、非空数量 data.dtypes # 每列数据类型 data.describe() # 数值列的统计描述
快速了解数据结构
2.2 模型训练 20 分
线性回归 必考 3/5 变体
点击展开 ▾
from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train)
最基础的回归模型
随机森林回归 必考 2/5 变体
点击展开 ▾
from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X_train, y_train)
100棵决策树的集成回归模型
训练 & 预测 & 得分 必考 5/5 变体
点击展开 ▾
model.fit(X_train, y_train) # 训练 y_pred = model.predict(X_test) # 预测 train_score = model.score(X_train, y_train) # 训练集得分 test_score = model.score(X_test, y_test) # 测试集得分
模型三板斧:训练 → 预测 → 评分
保存模型 (pickle) 必考 4/5 变体
点击展开 ▾
import pickle # 写法一:with open with open('model.pkl', 'wb') as f: pickle.dump(model, f)
把训练好的模型保存到文件。'wb' = 写入二进制
写报告文件 必考 5/5 变体
点击展开 ▾
with open('report.txt', 'w') as f: f.write(f'训练集得分: {model.score(X_train, y_train)}\n') f.write(f'测试集得分: {model.score(X_test, y_test)}\n') f.write(f'均方误差: {mean_squared_error(y_test, y_pred)}\n') f.write(f'决定系数: {r2_score(y_test, y_pred)}\n')
'w' 清空写入。报告一般包含:训练/测试得分 + MSE + R²
评估指标 必考 5/5 变体
点击展开 ▾
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score mse = mean_squared_error(y_test, y_pred) # 均方误差(越小越好) mae = mean_absolute_error(y_test, y_pred) # 平均绝对误差 r2 = r2_score(y_test, y_pred) # 决定系数(越接近1越好)
回归三指标:MSE、MAE 越小越好;R² 越接近1越好
哑变量转换 必考 3/5 变体
点击展开 ▾
X = pd.get_dummies(X) # 或带 drop_first=True 避免共线性 data = pd.get_dummies(data, drop_first=True)
分类变量转数值:如"男/女"变成两列0/1
逻辑回归 高频 1/5 变体
点击展开 ▾
from sklearn.linear_model import LogisticRegression model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train)
分类模型;max_iter=1000 增加迭代次数避免不收敛
分类报告 高频 1/5 变体
点击展开 ▾
from sklearn.metrics import classification_report report = classification_report(y_test, y_pred, zero_division=1) # 计算准确率 accuracy = (y_test == y_pred).mean()
详细分类指标报告;zero_division=1 避免除零警告
决策树回归 常考 1/5 变体
点击展开 ▾
from sklearn.tree import DecisionTreeRegressor model = DecisionTreeRegressor(random_state=42)
单棵决策树回归模型
XGBoost 回归 高频 2/5 变体
点击展开 ▾
import xgboost as xgb model = xgb.XGBRegressor(n_estimators=100, learning_rate=0.05, max_depth=5, random_state=42)
梯度提升树;参数:树数量、学习率、最大深度
Pipeline 管道 常考 1/5 变体
点击展开 ▾
from sklearn.pipeline import Pipeline pipeline = Pipeline([ ('scaler', StandardScaler()), ('linreg', LinearRegression()) # ← 注意带括号 () ])
串联多个步骤。⚠️ 每个模型都要带括号 () 实例化
SMOTE 过采样 常考 1/5 变体
点击展开 ▾
from imblearn.over_sampling import SMOTE smote = SMOTE(random_state=42) X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
对少数类过采样,平衡不均衡数据
保存模型 (joblib) 常考 1/5 变体
点击展开 ▾
import joblib joblib.dump(model, 'model.pkl')
另一种保存模型的方式,和 pickle 类似
保存预测结果 必考 5/5 变体
点击展开 ▾
# 方式一:CSV pd.DataFrame(y_pred, columns=['预测结果']).to_csv('results.txt', index=False) # 方式二:带实际值,TSV pd.DataFrame({'实际值': y_test, '预测值': y_pred}).to_csv('results.txt', index=False, sep='\t')
保存预测结果到文件;sep='\t' 用制表符分隔
清洗字符串数据 常考 1/5 变体
点击展开 ▾
# 去除所有字符串单元格的前后空格 df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x) # 用 apply 提取字符串中的数值 y = df['列名'].apply(lambda x: int(x.split(' ')[0]))
applymap 处理每个单元格;apply + split 从字符串提取数值

常见扣分陷阱

data.isnull.sum() → 应该是 data.isnull().sum(),isnull 后面要加括号
data.drop_dumplicates() → 正确拼写是 drop_duplicates
pd.to_numeric('列名') → 应该是 pd.to_numeric(data['列名']),传列数据不是字符串
pd.cut(['列名'], ...) → 应该是 pd.cut(data['列名'], ...)
data.value_counts → 缺少括号,应该是 data['列名'].value_counts()
LinearRegression 在 Pipeline 中不带括号 → 必须写 LinearRegression()
trian_test_split → 正确拼写是 train_test_split
pipleline → 变量名拼错,保持前后一致即可