首页 > pandas数据分析实战训练营 > 项目2:数据清洗与预处理

项目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())

实操步骤

  1. 读取orders.csv数据,用 df.isnull().sum() 检查缺失情况
  2. 对缺失比例超过50%的列,用 dropna(axis=1, thresh=...) 删除
  3. 对数值列(如金额),用该列平均值填充缺失值
  4. 对分类列(如省份),用众数(出现最多的值)填充缺失值
  5. duplicated().sum() 检查重复行数量
  6. drop_duplicates() 删除完全重复的行
  7. describe() 查看数值列的统计信息,发现异常值
  8. 用条件筛选删除不合理的异常数据(如金额为负数)
  9. 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题 选择题
统计每列缺失值数量应该使用?
A. df.isnull()
B. df.isnull().sum()
C. df.missing()
D. df.na_count()
答案解析

isnull()返回布尔表,sum()对True计数,得到每列缺失值数量。

第2题 选择题
用平均值填充某列缺失值,正确的写法是?
A. df['列'].fill(df['列'].mean())
B. df['列'].fillna(df['列'].mean())
C. df['列'].replace_na(df['列'].mean())
D. df['列'].fill_mean()
答案解析

fillna()是pandas填充缺失值的标准方法。

第3题 判断题
df.drop_duplicates() 会删除所有重复的行,一个都不保留。
正确
错误
答案解析

drop_duplicates()默认保留第一个重复项,删除后面的。可以用keep参数控制保留哪一个。

第4题 选择题
删除包含缺失值的行,应该使用?
A. df.drop_null()
B. df.remove_na()
C. df.dropna()
D. df.delete_na()
答案解析

dropna()是删除缺失值的标准方法,默认删除包含任何缺失值的行。

第5题 填空题
将列名'price'重命名为'价格',应写为:df.rename(columns={'price': '价格'}, inplace=)
答案解析

inplace=True表示直接修改原数据框,而不是返回一个新副本。

第6题 选择题
将数值限制在0到100之间,应该使用?
A. df['列'].limit(0, 100)
B. df['列'].clip(0, 100)
C. df['列'].bound(0, 100)
D. df['列'].restrict(0, 100)
答案解析

clip()方法会将小于下限的值设为下限,大于上限的值设为上限。

第7题 判断题
数据清洗通常只占数据分析工作很小的一部分时间。
正确
错误
答案解析

数据清洗通常占数据分析工作的60%-80%时间,是非常重要的一步。

0/7

项目小结

本项目我们学习了数据清洗的核心技能:

  • isnull().sum() 检查缺失值分布
  • dropna() 删除缺失严重的列或行
  • fillna() 填充缺失值(均值、众数等)
  • duplicated()drop_duplicates() 处理重复
  • describe() 和条件筛选发现异常值
  • clip() 限制数值范围
  • rename() 规范列名

数据清洗是数据分析中最重要也最耗时的环节,掌握这些技能,你的分析结果才会准确可靠。

← 上一项目:数据读取与基础操作 下一项目:数据筛选与查询 →