首页 / 数据采集与处理 / 第4章 数据清洗与预处理

第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章

自学自检小问题

  1. df.isnull().sum() 这个命令的作用是什么?
  2. 缺失值有哪些处理方式?什么时候该删除,什么时候该填充?
  3. 如何用箱线图法(IQR)找出异常值?写出核心代码。
  4. 如果一列日期数据被读成了字符串,应该怎么转换?
  5. drop_duplicates() 默认保留哪一条重复记录?
基础巩固层练习
0/5
第1题 选择题
Pandas中用于检测缺失值的函数是?
df.empty()
df.isnull()
df.dropna()
df.fillna()
答案解析
isnull()返回布尔值表示是否缺失。dropna()是删除缺失值,fillna()是填充缺失值。
第2题 选择题
Pandas中,删除含有缺失值的行应使用?
df.fillna()
df.dropna()
df.isnull()
df.replace()
答案解析
dropna()用于删除包含缺失值的行或列。fillna()用于填充缺失值。
第3题 判断题
df.drop_duplicates()会删除所有重复的行,一条都不保留。
正确
错误
答案解析
默认保留第一条重复记录(keep='first'),只删除后续的重复项。
第4题 选择题
箱线图法中,异常值的判定范围是?
大于均值的数据
小于Q1-1.5*IQR或大于Q3+1.5*IQR
等于中位数的数据
标准差大于1的数据
答案解析
箱线图法(IQR)将异常值定义为小于Q1-1.5*IQR或大于Q3+1.5*IQR的数据。
第5题 填空题
将字符串列转为日期时间类型的Pandas函数是 pd.______()
答案解析
pd.to_datetime()可以将字符串、数字等转换为Pandas的日期时间类型。
0/0