适合零基础学员,读完就能应付 人工智能训练师高级实操题1.1.1 ~ 1.1.5 所有填空题

作者:你的幽默导师 🤓


📖 一、填空题通用解题心法(速查表)

下表总结了 所有练习中出现的每一种填空类型,并给出了 可以直接照抄的代码模板出现的练习编号。 学习建议:先看“任务类型” → 找对应模板 → 去练习里验证。

任务类型 典型填空位置 正确代码模板(请直接照抄) 出现在哪个练习
📂 读取 CSV 文件 data = ________ pd.read_csv('文件名.csv') 1.1.1 ~ 1.1.5 全部
👀 查看前 5 行 print(________) data.head() 1.1.4, 1.1.5
🗑️ 删除缺失值 data = ________ data.dropna() 1.1.2, 1.1.4, 1.1.5
🔄 类型转换(int) data['列名'] = ________ data['Age'].astype(int) 1.1.2, 1.1.4, 1.1.5
🔄 类型转换(float) data['列名'] = ________ data['Speed'].astype(float) 1.1.2, 1.1.4, 1.1.5
🎯 单条件筛选(between) data[(data['Age'].between(18,70))] data['Age'].between(18,70) 1.1.3, 1.1.4, 1.1.5
🎯 多条件筛选 data = data[(________) & (________)] 见下方示例 1.1.4, 1.1.5
🧹 保存清洗后数据 ________('新文件.csv', index=False) data.to_csv 1.1.2, 1.1.3, 1.1.4, 1.1.5
📊 分组统计(计数+均值) sensor_stats = ________ data.groupby('SensorType')['Value'].agg(['count','mean']) 1.1.2
📊 交叉表(位置×传感器) location_stats = ________ data[data['SensorType'].isin(['Temperature','Humidity'])].groupby(['Location','SensorType'])['Value'].mean().unstack() 1.1.2
❓ 条件标记(np.where) data['is_abnormal'] = ________ np.where((data['SensorType']=='Temperature') & ((data['Value']<-10) | (data['Value']>50)), True, False) 1.1.2
🔢 统计异常值数量 print("异常值数量:", data['is_abnormal'].________) sum() 1.1.2
🔄 缺失值填充(前向) data['Value'].________ fillna(method='ffill', inplace=True) 1.1.2
🔄 缺失值填充(后向) data['Value'].________ fillna(method='bfill', inplace=True) 1.1.2
📊 缺失值统计 missing_values = data._________ isnull().sum() 1.1.3
📊 重复值统计 duplicate_values = data._________ duplicated().sum() 1.1.3
✅ 合理性标记(between) data['is_age_valid'] = _________._________(18,70) data['Age'].between(18,70) 1.1.3
✅ 合理性标记(比较) data['is_income_valid'] = _________ > _________ data['Income'] > 2000 1.1.3
✅ 多列合理性综合标记 validity_checks = data[['col1','col2']].all(axis=1) data[['is_age_valid','is_income_valid']].all(axis=1) 1.1.3
🗑️ 删除标记列 cleaned_data = _________.drop(________=['is_abnormal']) cleaned_data.drop(columns=['is_abnormal']) 1.1.2, 1.1.3
📏 标准化(Z-score) data['col'] = (data['col'] - ________) / ________ data['col'].mean()data['col'].std() 1.1.4
✂️ 分箱(pd.cut) data['AgeGroup'] = ________(________, bins, labels, right=False) pd.cut(data['Age'], bins, labels=labels, right=False) 1.1.1, 1.1.4, 1.1.5
👥 分组聚合(单列均值) gender_purchase = data._____________._____________ data.groupby('Gender')['PurchaseAmount'].mean() 1.1.4
👥 分组聚合(多列均值) gender_stats = data._____________._____________ data.groupby('Gender')[['Speed','TravelDistance','TravelTime']].mean() 1.1.5
📊 计数(value_counts) traffic_event_counts = _____________ data['TrafficEvent'].value_counts() 1.1.5
📊 分箱后统计各区间数量 age_group_counts = _____________ data['AgeGroup'].value_counts() 1.1.1, 1.1.4, 1.1.5
🔍 筛选不合理数据(取反) unreasonable = data[~((________) & (________))] ~(data['Age'].between(18,70) & data['Speed'].between(0,200)) 1.1.5
📐 计算比例(占比) high_risk_ratio = risk_counts['高风险'] / ________ len(data)risk_counts.sum() 1.1.1

速查表使用口诀: 读看删转筛,存盘记心间;分组计数的,切分加条件。 标准化和填补,模板直接黏;取反加括号,比例用总长。


🧠 二、每个函数的“人话解释”(生活类比 + 示例)

函数 / 方法 生活类比 代码示例(小白版)
pd.read_csv('文件.csv') 就像你打开一本 Excel 笔记本,把里面的内容一页页抄到 Python 里。 data = pd.read_csv('student.csv')
data.head() 偷看笔记本的前 5 页,确认是不是你要的那本。 print(data.head())
data.dropna() 检查每一页,如果有任何一页有空白没写,就把整页撕掉。 data = data.dropna()
data['Age'].astype(int) 把写着“18”的纸条变成数字 18,这样才能做加减。 data['Age'] = data['Age'].astype(int)
data['Age'].between(18, 70) 问一句:这个人的年龄在 18 到 70 之间吗?包含 18 和 70。 data[data['Age'].between(18,70)]
data.groupby('Gender') 把所有男生放一堆,所有女生放另一堆。 grouped = data.groupby('Gender')
.agg(['count','mean']) 对每一堆,先数数有几个人,再算一下平均分。 data.groupby('Class')['Score'].agg(['count','mean'])
.unstack() 把表格从“长条”变成“宽宽”的,比如原来一行是“位置A-温度”,变成一列是温度。 见 1.1.2 练习
np.where(条件, True, False) 就像老师批改:对的打√,错的打×。 np.where(data['Score']>=60, '及格', '不及格')
fillna(method='ffill') 空着的格子,用上面那个格子的数抄下来。 data['Value'].fillna(method='ffill', inplace=True)
fillna(method='bfill') 空着的格子,用下面那个格子的数抄下来。 data['Value'].fillna(method='bfill', inplace=True)
data.isnull().sum() 数一数每一列有多少个空单元格。 missing = data.isnull().sum()
data.duplicated().sum() 检查有没有两行完全一样,数一数重复的行数。 dup = data.duplicated().sum()
data['col'].value_counts() 数一数每个类别出现几次,比如交通事故类型:正常几次,拥堵几次。 data['TrafficEvent'].value_counts()
pd.cut(age, bins, labels) 把年龄切成几段,比如 18-25 叫“青年”,26-35 叫“中青年”。 pd.cut(data['Age'], bins=[18,26,36], labels=['18-25','26-35'])
(x - mean) / std 把不同单位的分数(比如 0-100 分和 0-10 分)变成统一的“标准分”。 (data['Score'] - data['Score'].mean()) / data['Score'].std()
data.to_csv('new.csv', index=False) 把整理好的笔记本存回抽屉,而且不在每页上写页码(index=False)。 data.to_csv('clean.csv', index=False)

1. pd.read_csv('文件.csv')

人话:告诉 Python “嘿,帮我把桌面上那个 Excel-like 文件读进来”。

例子:就像你打开一个装满数据的笔记本。

2. data.head()

人话:显示前 5 行,让你确认数据没读错。

例子:翻看作业本前 5 页,看看是不是英语作业。

3. data.dropna()

人话:删除任何一行里有一个空单元格的行。

例子:收作业时,如果谁有一道题没写,整本作业不要了(有点狠,但常用)。

4. astype(int)

人话:把文本形式的数字(如 "25")变成真正的整数 25,才能做加减。

例子:把写有“5个苹果”的纸条变成 5 个真实苹果。

5. .between(18, 70)

人话:判断数值是否在 [18, 70] 区间内,包含端点。

例子:查身份证,只允许 18~70 岁的人进场。

6. data.to_csv('xxx.csv', index=False)

人话:把处理好的表格存回硬盘。index=False 就是不要额外加一列行号。

例子:整理完作业本,放回抽屉,但不在每页上写页码。

7. value_counts()

人话:数一数列里每个不同值出现了几次。

例子:统计全班男生几个,女生几个。

8. groupby('列')['数值列'].mean()

人话:按某一列分组,然后计算每组另一列的平均值。

例子:按班级分组,计算每个班的平均分。

9. pd.cut(..., right=False)

人话:把连续的数字(如年龄)切成几段。right=False 表示区间是 左闭右开,比如 [18,26) 包括 18 但不包括 26。

例子:把考试分数切成 0~59, 60~100,注意 60 分算及格区间。

10. np.where(条件, 真值, 假值)

人话:对每一行,如果条件成立,就填真值,否则填假值。

例子:如果住院天数 > 7,标“高风险”,否则“低风险”。

11. 标准化 (x - mean)/std

人话:让数据变成平均值为 0,标准差为 1,不同单位的数字可以比较。

例子:把身高(cm)和体重(kg)都变成“比平均高多少/低多少”。

12. fillna(method='ffill')

人话:用上一个有效值填充当前的空值。

例子:老师点名册,某人没来,就用他前面的人的名字(有点怪但技术常用)。


📝 三、五个练习的完整答案(可运行代码 + 填空解释)

每个练习我只给出必须填空的代码块,其余部分保持原样。 注意:你需要根据实际列名微调,但框架完全一致。

🔹 练习 1.1.1 医疗风险统计

import pandas as pd
import numpy as np
​
# 读取数据
data = pd.read_csv('patient_data.csv')          # 📂 填空1
print(data.head())                              # 👀 填空2
​
# 删除缺失值
data = data.dropna()                            # 🗑️ 填空3
​
# 类型转换(假设有 Age, BMI, DaysInHospital 等)
data['Age'] = data['Age'].astype(int)           # 🔄 填空4
data['BMI'] = data['BMI'].astype(float)
​
# 创建风险等级列
data['RiskLevel'] = np.where(data['DaysInHospital'] > 7, '高风险患者', '低风险患者')   # ❓ 填空5
​
# 统计风险等级人数
risk_counts = data['RiskLevel'].value_counts()  # 📊 填空6
​
# 计算占比
high_risk_ratio = risk_counts['高风险患者'] / len(data)   # 📐 填空7
low_risk_ratio = risk_counts['低风险患者'] / len(data)
​
# BMI 区间划分
bmi_bins = [0, 18.5, 24, 28, np.inf]
bmi_labels = ['偏瘦', '正常', '超重', '肥胖']
data['BMIRange'] = pd.cut(data['BMI'], bins=bmi_bins, labels=bmi_labels, right=False)   # ✂️ 填空8
​
# 每个BMI区间的高风险比例
bmi_risk_rate = data.groupby('BMIRange')['RiskLevel'].apply(lambda x: (x == '高风险患者').mean())  # 👥 填空9
​
# 每个BMI区间的患者数
bmi_patient_count = data['BMIRange'].value_counts()   # 📊 填空10
​
# 年龄区间同理(省略,参照上面)

🔹 练习 1.1.2 农业传感器

import pandas as pd
import numpy as np
​
data = pd.read_csv('sensor_data.csv')   # 📂
​
# 1. 传感器统计(数量和平均值)
sensor_stats = data.groupby('SensorType')['Value'].agg(['count', 'mean'])   # 👥📊 填空1
​
# 2. 按位置统计温度和湿度
location_stats = data[data['SensorType'].isin(['Temperature', 'Humidity'])].groupby(['Location', 'SensorType'])['Value'].mean().unstack()   # 🧩 填空2
​
# 3. 标记异常值
data['is_abnormal'] = np.where(
    ((data['SensorType'] == 'Temperature') & ((data['Value'] < -10) | (data['Value'] > 50))) |
    ((data['SensorType'] == 'Humidity') & ((data['Value'] < 0) | (data['Value'] > 100))),
    True, False
)   # ❓ 填空3
​
# 输出异常值数量
print("异常值数量:", data['is_abnormal'].sum())   # 🔢 填空4
​
# 填补缺失值(前向+后向)
data['Value'].fillna(method='ffill', inplace=True)   # 🔄 填空5
data['Value'].fillna(method='bfill', inplace=True)   # 🔄 填空6
​
# 删除标记列并保存
cleaned_data = data.drop(columns=['is_abnormal'])   # 🗑️ 填空7
cleaned_data.to_csv('cleaned_sensor_data.csv', index=False)   # 🧹 填空8

🔹 练习 1.1.3 金融信用审核

import pandas as pd
import numpy as np
​
data = pd.read_csv('credit_data.csv')   # 📂
​
# 缺失值统计
missing_values = data.isnull().sum()    # 📊 填空1
duplicate_values = data.duplicated().sum()   # 填空2
​
# 合理性审核
data['is_age_valid'] = data['Age'].between(18, 70)   # 🎯 填空3
data['is_income_valid'] = data['Income'] > 2000      # 填空4
data['is_loan_amount_valid'] = data['LoanAmount'] < (data['Income'] * 5)   # 填空5
data['is_credit_score_valid'] = data['CreditScore'].between(300, 850)      # 填空6
​
# 综合合理标记
data['is_valid'] = data[['is_age_valid','is_income_valid','is_loan_amount_valid','is_credit_score_valid']].all(axis=1)
​
# 删除不合理行及标记列
cleaned_data = data[data['is_valid']].drop(columns=['is_age_valid','is_income_valid','is_loan_amount_valid','is_credit_score_valid','is_valid'])
​
# 保存
cleaned_data.to_csv('cleaned_credit_data.csv', index=False)   # 🧹 填空7

🔹 练习 1.1.4 电商用户行为

import pandas as pd
import numpy as np
​
data = pd.read_csv('user_behavior_data.csv')   # 📂
print(data.head())   # 👀
​
data = data.dropna()   # 🗑️
​
# 类型转换
data['Age'] = data['Age'].astype(int)                # 🔄
data['PurchaseAmount'] = data['PurchaseAmount'].astype(float)
data['ReviewScore'] = data['ReviewScore'].astype(int)
​
# 异常值过滤
data = data[(data['Age'].between(18, 70)) & 
            (data['PurchaseAmount'] > 0) & 
            (data['ReviewScore'].between(1, 5))]   # 🎯
​
# 标准化
data['PurchaseAmount'] = (data['PurchaseAmount'] - data['PurchaseAmount'].mean()) / data['PurchaseAmount'].std()   # 📏
data['ReviewScore'] = (data['ReviewScore'] - data['ReviewScore'].mean()) / data['ReviewScore'].std()
​
# 保存
data.to_csv('cleaned_user_behavior_data.csv', index=False)   # 🧹
​
# 统计每个购买类别的用户数
purchase_category_counts = data['PurchaseCategory'].value_counts()   # 📊
​
# 不同性别的平均购买金额
gender_purchase_amount_mean = data.groupby('Gender')['PurchaseAmount'].mean()   # 👥
​
# 年龄段划分
bins = [18, 26, 36, 46, 56, 66, np.inf]
labels = ['18-25', '26-35', '36-45', '46-55', '56-65', '65+']
data['AgeGroup'] = pd.cut(data['Age'], bins=bins, labels=labels, right=False)   # ✂️
age_group_counts = data['AgeGroup'].value_counts().sort_index()   # 📊

🔹 练习 1.1.5 交通数据

import pandas as pd
import numpy as np
​
data = pd.read_csv('vehicle_traffic_data.csv')   # 📂
print(data.head())   # 👀
​
data = data.dropna()   # 🗑️
​
# 类型转换
data['Age'] = data['Age'].astype(int)
data['Speed'] = data['Speed'].astype(float)
data['TravelDistance'] = data['TravelDistance'].astype(float)
data['TravelTime'] = data['TravelTime'].astype(float)
​
# 异常值过滤
data = data[(data['Age'].between(18, 70)) & 
            (data['Speed'].between(0, 200)) & 
            (data['TravelDistance'].between(1, 1000)) & 
            (data['TravelTime'].between(1, 1440))]   # 🎯
​
# 保存清洗后数据
data.to_csv('cleaned_vehicle_traffic_data.csv', index=False)   # 🧹
​
# 合理性审核(找出不合理的数据)
unreasonable_data = data[~((data['Age'].between(18, 70)) & 
                           (data['Speed'].between(0, 200)) & 
                           (data['TravelDistance'].between(1, 1000)) & 
                           (data['TravelTime'].between(1, 1440)))]   # 🔍 使用 ~ 取反
​
# 统计交通事件次数
traffic_event_counts = data['TrafficEvent'].value_counts()   # 📊
​
# 不同性别的平均车速、距离、时间
gender_stats = data.groupby('Gender')[['Speed','TravelDistance','TravelTime']].mean()   # 👥
​
# 年龄段划分
age_bins = [18, 26, 36, 46, 56, 66, np.inf]
age_labels = ['18-25', '26-35', '36-45', '46-55', '56-65', '65+']
data['AgeGroup'] = pd.cut(data['Age'], bins=age_bins, labels=age_labels, right=False)   # ✂️
age_group_counts = data['AgeGroup'].value_counts()   # 📊

⚠️ 四、常见错误 & 调试技巧

错误现象 最可能的原因 解决办法(从易到难) 幽默提醒
FileNotFoundError 文件名写错或文件不在当前文件夹 1. 检查文件名大小写、扩展名 .csv 2. 把文件放到和代码相同的文件夹 3. 写完整路径 'D:/data/xxx.csv' Python 找不到文件就像你喊“老王”但他叫“王老五” 😅
KeyError: 'Age' 列名写错了(比如少个空格,大小写不同) 运行 print(data.columns) 查看真实列名,然后抄下来 表格里是 age,你写 Age – Python 是近视眼,大小写不一样就不认
astype(int) 报错 ValueError 列里有空值(NaN)或非数字字符(如 '25岁' data = data.dropna() 删掉空值,或者用 pd.to_numeric(errors='coerce') 你不能把“三”变成 3,得先翻译
between(1,100) 包含 100 吗? 包含两端 记住:between 是闭区间,1 <= x <= 100 就像老师说“身高1米到2米之间”,1米和2米都算
pd.cut 出来的区间和想的不一样 默认 right=True(左开右闭) 加上 right=False 变成左闭右开 默认区间是 (18,26],改了就变成 [18,26)
保存后多了一列 Unnamed: 0 保存时没有写 index=False data.to_csv('new.csv', index=False) 不要给表格自动编页码
标准化后全是 NaN 该列所有值相同,标准差为 0 检查该列是否真的有效,或者跳过标准化 全班都考 0 分,平均分 0,没法算标准差
groupby 后想显示多列平均值,结果只显示一列 只写了一列名 用双括号 [['col1','col2']] 你要算两科成绩,就指明两科
np.where 写了很多条件,总是出错 忘记把每个条件用括号括起来 每个 &| 前后的条件都要加括号 ( ) 就像数学里 (a+b)*ca+b*c 不一样,括号很重要

调试三板斧

  1. 打印形状print(data.shape) – 看看数据还有多少行。

  2. 打印列名print(data.columns) – 确认名字没写错。

  3. 打印前几行print(data.head()) – 肉眼检查数据是否合理。


🎉 结语

恭喜你学完了 Pandas 填空通关手册! 记住:代码只是工具,思路才是核心。下次遇到任何 CSV 文件,你都知道该先读、再看、删空、改类型、筛异常、做统计、存结果。

幽默收尾

数据处理就像洗菜做饭——先挑烂叶子(缺失值),再切块(类型转换),然后下锅煮(标准化),最后盛盘(保存)。 而你现在,已经是一个合格的“数据小厨”了! 👨‍🍳🐼

有任何不懂的,回来翻翻这本手册,或者喊一声“导师助教”~