适用练习:2.1.1 汽车燃油效率、2.1.2 低碳生活行为、2.1.3 信用评分、2.1.4 医疗研究、2.1.5 健康营养咨询 目标:零基础学员也能填对所有下划线,理解每一步在做什么
📖 一、填空题通用解题心法(速查表)
| 任务类型 | 典型填空位置 | 正确代码模板(直接照抄) | 出现在哪个练习 |
|---|---|---|---|
| 📂 读取 CSV / Excel | data = __________ |
pd.read_csv('文件名.csv') 或 pd.read_excel('文件名.xlsx') |
2.1.1~2.1.5 |
| 👀 查看前5行 | print(__________) |
data.head() |
2.1.1, 2.1.2 |
| 🔍 查看数据类型 | print(data.dtypes) |
(已经给出,不需填空) | 2.1.1, 2.1.4 |
| 📊 查看缺失值数量 | print(__________.__________.__________) |
data.isnull().sum() |
2.1.1, 2.1.4, 2.1.5 |
| 🗑️ 删除缺失值所在行 | data = __________ |
data.dropna() |
2.1.1, 2.1.2, 2.1.5 |
| 🔄 转换数据类型(异常值转NaN) | data['col'] = __________(data['col'], errors='coerce') |
pd.to_numeric |
2.1.1, 2.1.5 |
| 🗑️ 删除转换后产生的缺失值 | data = __________ |
data.dropna() |
2.1.1 |
| 📏 标准化(StandardScaler) | data[numerical_features] = __________ |
scaler.fit_transform(data[numerical_features]) |
2.1.1, 2.1.2 |
| 📐 归一化(MinMaxScaler) | data[cols] = __________ |
scaler.fit_transform(data[cols]) |
2.1.3, 2.1.4 |
| 🧹 删除重复值 | data = __________ |
data.drop_duplicates() |
2.1.2, 2.1.3, 2.1.4, 2.1.5 |
| 📈 箱线图 + IQR 异常值处理 | Q1 = data.quantile(0.25) 等 |
见下方模板 | 2.1.3 |
| 🏷️ 特征选择 | selected_features = [__________] |
列名列表 | 2.1.1, 2.1.2 |
| 🎯 定义 X 和 y | X = __________ y = __________ |
data[selected_features] 和 data['mpg'] |
2.1.1, 2.1.2, 2.1.3 |
| ✂️ 划分训练/测试集 | X_train, X_test, y_train, y_test = __________(__________, random_state=42) |
train_test_split(X, y, test_size=0.2) |
2.1.1, 2.1.2, 2.1.3 |
| 💾 保存 CSV(无索引) | __________('文件名.csv', __________) |
data.to_csv('2.1.x_cleaned_data.csv', index=False) |
全部 |
| 📅 日期格式转换 | data['列'] = pd.to_datetime(data['列']) |
(已给出) | 2.1.4 |
| ✏️ 修改列名 | __________.rename(columns={'旧名':'新名'}, inplace=True) |
data.rename |
2.1.4 |
| ➕ 增加新列(日期差) | data['新列'] = (data['日期2'] - data['日期1']).dt.days |
见模板 | 2.1.4 |
| 🏷️ 标签编码(LabelEncoder) | data['列'] = label_encoder.fit_transform(data['列']) |
见模板 | 2.1.5 |
| 🥧 绘制饼图 | plt.pie(..., autopct='%1.1f%%') |
见模板 | 2.1.5 |
🧠 二、每个函数的“人话解释”(生活类比 + 示例)
| 函数 / 方法 | 生活类比 | 代码示例(小白版) |
|---|---|---|
pd.read_csv('file.csv') |
打开一个 CSV 表格文件,把内容搬进 Python。 | data = pd.read_csv('auto-mpg.csv') |
data.head() |
瞄一眼表格的前 5 行,确认没读错。 | print(data.head()) |
data.isnull().sum() |
数一数每一列有多少个空单元格。 | print(data.isnull().sum()) |
data.dropna() |
扔掉任何一行里有一个空格的整行作业。 | data = data.dropna() |
pd.to_numeric(col, errors='coerce') |
把“马力”列里的问号 ? 变成 NaN(无法转换的就变成缺失值)。 |
data['horsepower'] = pd.to_numeric(data['horsepower'], errors='coerce') |
StandardScaler() |
标准化:让数据的平均值为 0,标准差为 1,不同单位可以比较。 | scaler.fit_transform(data[features]) |
MinMaxScaler() |
归一化:把所有数据压缩到 [0,1] 区间。 | scaler.fit_transform(data[cols]) |
data.drop_duplicates() |
删除完全重复的行(就像删掉一模一样的两页作业)。 | data = data.drop_duplicates() |
data.quantile(0.25) |
计算第一四分位数(排在 25% 位置的那个数)。 | Q1 = data['age'].quantile(0.25) |
| IQR 异常值删除 | 找出小于 Q1-1.5IQR 或大于 Q3+1.5IQR 的值,并删掉。 | data_cleaned = data[~((data < lower) | (data > upper)).any(axis=1)] |
train_test_split(X, y, test_size=0.2) |
把数据分成训练集(80%)和测试集(20%),就像把复习资料分成平时练习和模拟考。 | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) |
pd.to_datetime() |
把“2023/01/15”这种乱七八糟的日期统一成标准格式。 | data['就诊日期'] = pd.to_datetime(data['就诊日期']) |
data.rename(columns={'旧':'新'}, inplace=True) |
把列名“病人ID”改成“患者ID”。 | data.rename(columns={'病人ID':'患者ID'}, inplace=True) |
(date2 - date1).dt.days |
计算两个日期相差多少天。 | data['诊断延迟'] = (data['诊断日期'] - data['就诊日期']).dt.days |
LabelEncoder() |
把文字类别(如“经常运动”、“偶尔运动”)变成数字(0,1,2)。 | le.fit_transform(data['健身水平']) |
plt.pie() |
画饼图,显示各部分比例。 | plt.pie(counts, autopct='%1.1f%%') |
⚠️ 三、常见错误 & 调试技巧(小白救急版)
| 错误现象 | 最可能的原因 | 解决办法 | 幽默提醒 |
|---|---|---|---|
FileNotFoundError |
文件名或路径不对 | 检查文件名大小写、扩展名,或使用绝对路径 | Python 找不到文件就像你喊“老王”但他叫“王老五” 😅 |
KeyError: 'horsepower' |
列名写错(大小写、空格) | 运行 print(data.columns) 查看真实列名 |
表格里是 Horsepower,你写 horsepower – 大小写敏感! |
pd.to_numeric 后全是 NaN |
该列全是非数字(如全是问号) | 先检查 data['col'].unique(),可能需要手动替换 |
你不能把“三个问号”变成数字 |
ValueError: could not convert string to float |
类型转换遇到非数字字符 | 使用 errors='coerce' 转成 NaN,然后删除 |
就像把“苹果”变成数字 – 办不到 |
IQR 删除异常值后数据变空 |
异常值范围太宽或数据量小 | 检查 Q1 和 Q3 是否合理,或者放宽倍数(如改为 3) |
你可能把整个班都当成“异常”开除了 |
| 标准化/归一化后全是 NaN | 某列所有值相同,标准差为 0 | 删除该列或检查数据是否有效 | 全班都考 0 分,没法算标准差 |
train_test_split 报错 |
X 和 y 行数不一致 | 确保 X 和 y 来自同一个 DataFrame 且没有缺失值 | 你不能拿 10 个人的数学成绩去匹配 8 个人的语文成绩 |
保存 CSV 后多了一列 Unnamed: 0 |
保存时没有写 index=False |
to_csv('file.csv', index=False) |
不要给表格自动编页码 |
pd.read_excel 报错 Missing optional dependency 'openpyxl' |
没有安装 Excel 读取引擎 | pip install openpyxl |
想打开 Excel 得先装个开瓶器 |
调试三板斧:
-
打印形状:
print(data.shape)– 看看还有多少行。 -
打印列名:
print(data.columns)– 确认名字没写错。 -
打印前几行:
print(data.head())– 肉眼检查数据是否合理。
🎉 结语
恭喜你!你已经掌握了 2.1 系列所有数据清洗和预处理 的填空套路。 记住:数据预处理 = 读数据 → 查缺失 → 删空行 → 转类型 → 删异常 → 标准化/归一化 → 删重复 → 选特征 → 切分 → 保存。 这个流程就像做饭:洗菜 → 切菜 → 下锅 → 调味 → 装盘。🍳
通关咒语:
读看删转删,异常 IQR 干; 标准化归一化,重复全删完; 选特切分存,考试不犯难! 🧙♂️
祝你顺利通过人工智能训练师考试! 🚀