Python 数据分析与可视化 Day 2 - 数据清洗基础
🎯 今日目标
- 学会识别和处理缺失数据(NaN)
- 学会删除/填补缺失值
- 清理重复数据
- 修改列类型,准备数据分析
🧼 一、缺失值处理(NaN)
✅ 1. 检查缺失值
import pandas as pd
df = pd.read_csv("students.csv")print(df.isnull()) # 每个元素是否为 NaN
print(df.isnull().sum()) # 每列缺失值数量
✅ 2. 删除缺失数据
df.dropna() # 删除包含 NaN 的行
df.dropna(axis=1) # 删除包含 NaN 的列
inplace=True
参数可以就地修改,不返回新对象。
✅ 3. 填充缺失数据
df.fillna(0) # 全部填 0
df["成绩"].fillna(df["成绩"].mean()) # 用均值填充
df.fillna(method="ffill") # 用上一行填
df.fillna(method="bfill") # 用下一行填
🔁 二、重复值处理
✅ 1. 检测重复数据
df.duplicated() # 标记每行是否重复(默认所有列)
df.duplicated(subset=["姓名"]) # 指定列检查
✅ 2. 删除重复数据
df.drop_duplicates(inplace=True)
🔧 三、数据类型转换
df["成绩"] = df["成绩"].astype(float)
df["是否及格"] = df["是否及格"].astype(bool)
可以使用
df.dtypes
查看所有列的数据类型。
🧪 今日练习任务
使用以下示例数据,完成清洗操作:
姓名,性别,成绩,是否及格
张三,男,88,True
李四,女,,True
王五,男,59,False
张三,男,88,True
赵六,,92,True
田七,女,NaN,
📝 任务:
-
加载该 CSV 文件为 DataFrame
-
检查每列缺失值数量
-
删除性别缺失的行
-
用“成绩”列均值填补成绩缺失值
-
删除重复的行(姓名、成绩相同)
-
将“成绩”列类型设置为
float
,将“是否及格”填补为False
import pandas as pd import os# 路径设置 input_path = "./data/students_dirty.csv" output_path = "./data/students_cleaned.csv"# 确保输出目录存在 os.makedirs(os.path.dirname(output_path), exist_ok=True)# 加载原始数据 df = pd.read_csv(input_path) print("原始数据:") print(df)# 1. 检查每列缺失值数量 print("\n缺失值统计:") print(df.isnull().sum())# 2. 删除性别缺失的行 df = df.dropna(subset=["性别"])# 3. 用“成绩”列均值填补缺失值 # 保留整数部分,四舍五入到整数 mean_score = df["成绩"].mean().round() df["成绩"] = df["成绩"].fillna(mean_score)# 4. 删除重复的行(默认检查所有列) df = df.drop_duplicates()# 5. 填补“是否及格”空缺值为 False with pd.option_context("future.no_silent_downcasting", True):df = df.fillna(False).infer_objects(copy=False)# 6. 数据类型转换 df["成绩"] = df["成绩"].astype(float) df["是否及格"] = df["是否及格"].astype(bool)# 显示清洗结果 print("\n清洗后的数据:") print(df)# 保存结果 df.to_csv(output_path, index=False, encoding="utf-8") print(f"\n✅ 清洗后的数据已保存至 {output_path}")
✅ 示例输出(清洗后)
原始数据:姓名 性别 成绩 是否及格 0 张三 男 88.0 True 1 李四 女 NaN True 2 王五 男 59.0 False 3 张三 男 88.0 True 4 赵六 NaN 92.0 True 5 田七 女 NaN NaN缺失值统计: 姓名 0 性别 1 成绩 2 是否及格 1 dtype: int64清洗后的数据:姓名 性别 成绩 是否及格 0 张三 男 88.0 True 1 李四 女 78.0 True 2 王五 男 59.0 False 5 田七 女 78.0 False✅ 清洗后的数据已保存至 ./data/students_cleaned.csv
姓名 性别 成绩 是否及格 0 张三 男 88.0 True 1 李四 女 79.7 True 2 王五 男 59.0 False 3 田七 女 79.7 False
✍️ 今日总结
- 掌握了
dropna()
、fillna()
、drop_duplicates()
等数据清洗方法 - 学会判断和填补缺失值
- 理解了数据类型转换在分析前的重要性