← 返回首页

项目06: 数据清洗

处理缺失值、重复数据、异常值,标准化数据格式

📊 数据集预览

使用 retail_orders 数据集,包含订单ID、客户ID、产品信息、订单日期、销售额、数量等字段。

retail_orders.csv(前5行)

🎯 学习目标

  • 识别和处理数据中的缺失值
  • 检测并删除重复数据
  • 处理异常值和离群点
  • 统一数据格式和类型转换
  • 字符串数据的清洗和规范化

💡 知识点1: 处理缺失值

缺失值是数据分析中最常见的问题之一。Pandas使用 NaN 表示缺失值。

💡 小贴士:使用 df.isnull() 检测缺失值,返回布尔值DataFrame。

代码示例

import pandas as pd

df = pd.read_csv('retail_orders.csv')

# 检测每列的缺失值数量
print(df.isnull().sum())

# 检测是否有缺失值
print(df.isnull().any())
⚠️ 注意事项:处理缺失值时需要根据业务场景选择合适的方法,不能盲目删除或填充。
运行代码
点击"运行代码"查看输出...

💡 知识点2: 删除缺失值

对于缺失值,可以选择删除含有缺失值的行或列。

# 删除含有缺失值的行
df_cleaned = df.dropna()

# 删除缺失值比例超过50%的列
threshold = len(df) * 0.5
df_cleaned = df.dropna(thresh=threshold, axis=1)
运行代码
点击"运行代码"查看输出...

💡 知识点3: 填充缺失值

有时候删除缺失值会丢失重要信息,可以用均值、中位数、众数或指定值填充。

# 用均值填充数值列的缺失值
df['sales'] = df['sales'].fillna(df['sales'].mean())

# 用中位数填充
df['quantity'] = df['quantity'].fillna(df['quantity'].median())

# 用众数填充分类变量
df['category'] = df['category'].fillna(df['category'].mode()[0])

# 用前一个值填充(前向填充)
df['price'] = df['price'].fillna(method='ffill')
运行代码
点击"运行代码"查看输出...

💡 知识点4: 处理重复数据

重复数据会干扰分析结果,需要识别并删除。

# 检测重复行
print(df.duplicated().sum())

# 查看重复行的详细信息
print(df[df.duplicated(keep=False)])

# 删除重复行(保留第一次出现的)
df_unique = df.drop_duplicates()

# 基于特定列删除重复
df_unique = df.drop_duplicates(subset=['order_id', 'product_id'])
💡 小贴士:使用 keep=False 可以显示所有重复的行,方便查看具体情况。
运行代码
点击"运行代码"查看输出...

💡 知识点5: 处理异常值

异常值(离群点)是偏离正常范围的数据点,可能由错误或真实极端值造成。

# 使用IQR方法检测异常值
Q1 = df['sales'].quantile(0.25)
Q3 = df['sales'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 筛选正常范围内的数据
df_normal = df[(df['sales'] >= lower_bound) & (df['sales'] <= upper_bound)]

# 或者用Z-score方法
from scipy import stats
z_scores = stats.zscore(df['sales'])
df_normal = df[abs(z_scores) < 3]
⚠️ 注意事项:不是所有异常值都需要处理,有些极端值可能反映真实的业务情况,需要根据具体场景判断。
运行代码
点击"运行代码"查看输出...

💡 知识点6: 数据类型转换与格式化

确保数据类型正确是数据清洗的重要步骤,错误的类型会导致计算错误。

# 查看数据类型
print(df.dtypes)

# 转换数据类型
df['order_date'] = pd.to_datetime(df['order_date'])
df['quantity'] = df['quantity'].astype(int)
df['sales'] = df['sales'].astype(float)

# 清理字符串中的空格
df['product_name'] = df['product_name'].str.strip()
df['category'] = df['category'].str.upper()
运行代码
点击"运行代码"查看输出...

💡 知识点7: 字符串数据清洗

字符串数据常包含多余的空格、特殊字符或大小写不一致的问题。

# 去除首尾空格
df['product_name'] = df['product_name'].str.strip()

# 统一大小写
df['category'] = df['category'].str.lower()  # 转小写
df['brand'] = df['brand'].str.upper()  # 转大写

# 替换特殊字符
df['address'] = df['address'].str.replace('\n', ' ')
df['phone'] = df['phone'].str.replace(r'[^\d]', '', regex=True)

# 去除数字中的逗号
df['price'] = df['price'].str.replace(',', '').astype(float)
运行代码
点击"运行代码"查看输出...
📋 总代码运行框 - 数据清洗完整示例
点击"运行代码"查看输出...