适合零基础学员,读完就能应付 人工智能训练师高级实操题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)*c 和 a+b*c 不一样,括号很重要 |
调试三板斧:
-
打印形状:
print(data.shape)– 看看数据还有多少行。 -
打印列名:
print(data.columns)– 确认名字没写错。 -
打印前几行:
print(data.head())– 肉眼检查数据是否合理。
🎉 结语
恭喜你学完了 Pandas 填空通关手册! 记住:代码只是工具,思路才是核心。下次遇到任何 CSV 文件,你都知道该先读、再看、删空、改类型、筛异常、做统计、存结果。
幽默收尾:
数据处理就像洗菜做饭——先挑烂叶子(缺失值),再切块(类型转换),然后下锅煮(标准化),最后盛盘(保存)。 而你现在,已经是一个合格的“数据小厨”了! 👨🍳🐼
有任何不懂的,回来翻翻这本手册,或者喊一声“导师助教”~