第4章 数据清洗与预处理
理论4课时 + 上机6课时 | 难度:核心重点
4.1 为什么需要数据清洗
从各种渠道采集来的原始数据往往"很脏":有些值缺失了、有些值明显填错了、有些记录重复了、格式也不统一。如果不清洗就直接分析,结果会不准确甚至完全错误。数据清洗就是给数据"洗澡",让它变得干净、规范、可用。
4.2 安装Pandas
# 安装pandas
pip install pandas openpyxl
# 验证安装
4.3 用Pandas读取数据
Pandas可以读取多种格式的数据文件,最常用的有CSV和Excel两种。
import pandas as pd
# 读取CSV文件
df = pd.read_csv('data.csv')
print(df.head()) # 查看前5行
# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 查看数据基本信息
print(df.shape) # 行数和列数
print(df.columns) # 列名
print(df.dtypes) # 每列的数据类型
4.4 缺失值处理
缺失值就是表格里空着的格子,在Pandas里显示为NaN(Not a Number)。缺失值会影响统计结果,需要检测并处理。
# 检测缺失值
print(df.isnull().sum()) # 每列有多少个缺失值
# 删除含有缺失值的行
df_clean = df.dropna()
# 填充缺失值:用固定值填充
df['年龄'].fillna(0, inplace=True)
# 填充缺失值:用平均值填充
df['成绩'].fillna(df['成绩'].mean(), inplace=True)
# 填充缺失值:用前一个有效值填充(前向填充)
df['日期'].fillna(method='ffill', inplace=True)
4.5 重复值处理
数据采集时可能会重复抓取同一条记录,导致数据重复。重复数据会干扰统计结果,需要去重。
# 检测重复行
print(df.duplicated().sum()) # 有多少行完全重复
# 查看重复的行
duplicates = df[df.duplicated(keep=False)]
print(duplicates)
# 删除重复行(保留第一条)
df_unique = df.drop_duplicates()
# 按指定列去重
df_unique = df.drop_duplicates(subset=['姓名', '手机号'])
4.6 异常值检测
异常值就是明显不合理的数据,比如年龄填了200岁,或者温度是-999度。常用检测方法有:箱线图法(IQR)和3sigma原则。
# 方法1:箱线图法(IQR)
Q1 = df['成绩'].quantile(0.25) # 第1四分位数
Q3 = df['成绩'].quantile(0.75) # 第3四分位数
IQR = Q3 - Q1
# 异常值范围:小于 Q1-1.5*IQR 或 大于 Q3+1.5*IQR
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
# 标记异常值
outliers = df[(df['成绩'] < lower) | (df['成绩'] > upper)]
print(f'发现{len(outliers)}个异常值')
# 方法2:用条件过滤替换异常值
df.loc[df['年龄'] > 120, '年龄'] = None # 年龄超过120设为缺失
df.loc[df['年龄'] < 0, '年龄'] = None # 负数年龄设为缺失
4.7 数据类型转换
数据读取后,列的类型可能不对。比如日期读成了字符串,数字读成了文本。需要转换成正确的类型才能计算。
# 查看当前数据类型
print(df.dtypes)
# 转换数据类型
df['年龄'] = df['年龄'].astype(int) # 转为整数
df['价格'] = df['价格'].astype(float) # 转为浮点数
df['日期'] = pd.to_datetime(df['日期']) # 转为日期时间
df['类别'] = df['类别'].astype('category') # 转为分类类型
# 去掉字符串中的空格
df['姓名'] = df['姓名'].str.strip()
# 字符串转小写
df['邮箱'] = df['邮箱'].str.lower()
自学拓展素材
- 官方文档:Pandas用户指南(pandas.pydata.org/docs/user_guide/)
- 视频教程:B站搜索"Pandas数据清洗实战",推荐Datawhale开源教程
- 练习数据集:Kaggle的Titanic数据集(经典清洗练习)
- 在线练习:和鲸社区(www.heywhale.com)有Pandas实战项目
- 书籍推荐:《利用Python进行数据分析》(第2版)第7章
自学自检小问题
- df.isnull().sum() 这个命令的作用是什么?
- 缺失值有哪些处理方式?什么时候该删除,什么时候该填充?
- 如何用箱线图法(IQR)找出异常值?写出核心代码。
- 如果一列日期数据被读成了字符串,应该怎么转换?
- drop_duplicates() 默认保留哪一条重复记录?
基础巩固层练习
0/5
第1题
选择题
Pandas中用于检测缺失值的函数是?
答案解析
isnull()返回布尔值表示是否缺失。dropna()是删除缺失值,fillna()是填充缺失值。
第2题
选择题
Pandas中,删除含有缺失值的行应使用?
答案解析
dropna()用于删除包含缺失值的行或列。fillna()用于填充缺失值。
第3题
判断题
df.drop_duplicates()会删除所有重复的行,一条都不保留。
答案解析
默认保留第一条重复记录(keep='first'),只删除后续的重复项。
第4题
选择题
箱线图法中,异常值的判定范围是?
答案解析
箱线图法(IQR)将异常值定义为小于Q1-1.5*IQR或大于Q3+1.5*IQR的数据。
第5题
填空题
将字符串列转为日期时间类型的Pandas函数是 pd.______()
答案解析
pd.to_datetime()可以将字符串、数字等转换为Pandas的日期时间类型。
0/0