项目2:数据清洗与预处理
数据集:电商订单数据 | 难度:入门 | 预计用时:50分钟
学习目标
- 识别并处理缺失值(删除、填充、标记)
- 检测并处理重复数据
- 识别并处理异常值
- 掌握列重命名和数据类型转换
知识点讲解
1. 为什么要清洗数据?
真实世界的数据往往很"脏":有缺失、有重复、有错误。如果不清洗,分析结果就会出错。数据清洗通常占数据分析工作的60%-80%时间。
2. 缺失值处理
缺失值就是表格里空着的格子。pandas用NaN(Not a Number)表示缺失。
df.isnull().sum():统计每列有多少个缺失值df.dropna():删除包含缺失值的行df['列名'].fillna(值):用指定值填充缺失df['列名'].fillna(df['列名'].mean()):用平均值填充
3. 重复值处理
重复数据会影响统计结果,需要删除。
df.duplicated().sum():统计重复行数量df.drop_duplicates():删除重复行,保留第一个df.drop_duplicates(subset=['列A','列B']):按指定列判断重复
4. 异常值处理
异常值是明显不合理的数据,比如年龄200岁、订单金额-100元。
- 用describe()看最大最小值,发现异常
- 用条件筛选找出异常值:
df[df['年龄'] > 150] - 删除异常值:
df = df[df['年龄'] <= 150] - 或用clip限制范围:
df['年龄'].clip(0, 120)
5. 列重命名
有时候列名是英文或缩写,需要改成中文方便理解:
df.rename(columns={'old_name': '新名称', 'price': '价格'}, inplace=True)
完整代码示例
import pandas as pd
# 读取电商订单数据
df = pd.read_csv('orders.csv')
# ===== 第一步:查看缺失值 =====
print("=== 每列缺失值数量 ===")
print(df.isnull().sum())
# 删除缺失严重的列(缺失超过50%)
thresh = len(df) * 0.5
df = df.dropna(axis=1, thresh=thresh)
# 用平均值填充'金额'列的缺失值
df['金额'] = df['金额'].fillna(df['金额'].mean())
# 用众数填充'省份'列的缺失值(最常见的省份)
mode_province = df['省份'].mode()[0]
df['省份'] = df['省份'].fillna(mode_province)
# ===== 第二步:处理重复值 =====
print("\n=== 重复行数量 ===")
print(df.duplicated().sum())
# 删除完全重复的行
df = df.drop_duplicates()
# 按订单号去重(保留最后一条)
df = df.drop_duplicates(subset=['订单号'], keep='last')
# ===== 第三步:处理异常值 =====
print("\n=== 金额列统计 ===")
print(df['金额'].describe())
# 找出金额为负数或过大的异常订单
abnormal = df[(df['金额'] < 0) | (df['金额'] > 100000)]
print("\n=== 异常订单 ===")
print(abnormal)
# 删除金额小于等于0的订单
df = df[df['金额'] > 0]
# 将金额限制在合理范围(0, 50000)
df['金额'] = df['金额'].clip(0, 50000)
# ===== 第四步:列重命名 =====
df.rename(columns={
'order_id': '订单号',
'amount': '金额',
'province': '省份',
'create_time': '下单时间'
}, inplace=True)
print("\n=== 清洗后的数据 ===")
print(df.head())
print(df.info())
实操步骤
- 读取orders.csv数据,用
df.isnull().sum()检查缺失情况 - 对缺失比例超过50%的列,用
dropna(axis=1, thresh=...)删除 - 对数值列(如金额),用该列平均值填充缺失值
- 对分类列(如省份),用众数(出现最多的值)填充缺失值
- 用
duplicated().sum()检查重复行数量 - 用
drop_duplicates()删除完全重复的行 - 用
describe()查看数值列的统计信息,发现异常值 - 用条件筛选删除不合理的异常数据(如金额为负数)
- 用
rename()将英文列名改为中文,方便后续分析
配套数据集:orders.csv
订单号,用户ID,金额,省份,下单时间
A001,U100,299.5,广东,2024-01-15
A002,U101,150.0,,2024-01-16
A003,U102,-50.0,浙江,2024-01-16
A004,U103,899.0,江苏,2024-01-17
A005,U100,299.5,广东,2024-01-15
A006,U104,,广东,2024-01-18
A007,U105,120000.0,北京,2024-01-19
A008,U106,45.0,四川,2024-01-20
A009,U107,678.0,,2024-01-21
A010,U108,0.0,上海,2024-01-22
交互式练习题
0/7
第1题
选择题
统计每列缺失值数量应该使用?
答案解析
isnull()返回布尔表,sum()对True计数,得到每列缺失值数量。
第2题
选择题
用平均值填充某列缺失值,正确的写法是?
答案解析
fillna()是pandas填充缺失值的标准方法。
第3题
判断题
df.drop_duplicates() 会删除所有重复的行,一个都不保留。
答案解析
drop_duplicates()默认保留第一个重复项,删除后面的。可以用keep参数控制保留哪一个。
第4题
选择题
删除包含缺失值的行,应该使用?
答案解析
dropna()是删除缺失值的标准方法,默认删除包含任何缺失值的行。
第5题
填空题
将列名'price'重命名为'价格',应写为:df.rename(columns={'price': '价格'}, inplace=)
答案解析
inplace=True表示直接修改原数据框,而不是返回一个新副本。
第6题
选择题
将数值限制在0到100之间,应该使用?
答案解析
clip()方法会将小于下限的值设为下限,大于上限的值设为上限。
第7题
判断题
数据清洗通常只占数据分析工作很小的一部分时间。
答案解析
数据清洗通常占数据分析工作的60%-80%时间,是非常重要的一步。
0/7
项目小结
本项目我们学习了数据清洗的核心技能:
- 用
isnull().sum()检查缺失值分布 - 用
dropna()删除缺失严重的列或行 - 用
fillna()填充缺失值(均值、众数等) - 用
duplicated()和drop_duplicates()处理重复 - 用
describe()和条件筛选发现异常值 - 用
clip()限制数值范围 - 用
rename()规范列名
数据清洗是数据分析中最重要也最耗时的环节,掌握这些技能,你的分析结果才会准确可靠。