当前位置:首页>python>Python 数据清洗实战:5 个技巧搞定脏数据

Python 数据清洗实战:5 个技巧搞定脏数据

  • 2026-09-10 20:10:42
Python 数据清洗实战:5 个技巧搞定脏数据

📊 做数据分析的朋友都知道一句话:"Garbage In, Garbage Out"(垃圾进,垃圾出)。

     再厉害的算法,再强大的模型,如果输入的数据质量差,结果也毫无价值。

而现实工作中,我们拿到的数据往往是这样的:

❌ 缺失值一大堆
❌ 重复记录数不清
❌ 格式混乱不统一
❌ 异常值难以识别
❌ 数据类型错误

✨ 今天分享 5 个实用的 Python 数据清洗技巧,帮你快速搞定脏数据,让分析工作事半功倍!


🧹 一、处理缺失值:不只是删除那么简单

📌 1.1 检测缺失值

import pandas as pd
import numpy as np

# 读取数据
df = pd.read_excel('销售数据.xlsx')

# 查看缺失情况
print(df.isnull().sum())
print(df.isnull().mean())  # 缺失比例

📌 1.2 删除缺失值

# 删除所有列都有缺失的行
df.dropna(how='all', inplace=True)

# 删除特定列缺失的行
df.dropna(subset=['销售额', '客户 ID'], inplace=True)

# 保留至少有 3 个非空值的行
df.dropna(thresh=3, inplace=True)

📌 1.3 填充缺失值

# 用均值填充
df['销售额'].fillna(df['销售额'].mean(), inplace=True)

# 用中位数填充(更稳健)
df['销售额'].fillna(df['销售额'].median(), inplace=True)

# 用众数填充(分类数据)
df['城市'].fillna(df['城市'].mode()[0], inplace=True)

# 用固定值填充
df['备注'].fillna('无', inplace=True)

💡 实战建议:

缺失比例
处理方式
🟢 < 5%
直接删除
🟡 5%-30%
填充(均值/中位数/众数)
🔴 > 30%
考虑删除该列或用模型预测

🔄 二、处理重复值:精准去重

📌 2.1 检测重复值

# 查看完全重复的行
print(df.duplicated().sum())

# 查看特定列的重复值
print(df['客户 ID'].duplicated().sum())

# 查看重复值详情
duplicates = df[df.duplicated(keep=False)]
print(duplicates)

📌 2.2 删除重复值

# 删除完全重复的行(保留第一条)
df.drop_duplicates(inplace=True)

# 根据特定列去重
df.drop_duplicates(subset=['客户 ID'], inplace=True)

# 保留最后一条
df.drop_duplicates(subset=['订单号'], keep='last', inplace=True)

💡 实战案例:

销售数据去重:同一客户同一天只保留金额最大的记录

df = df.sort_values('销售额', ascending=False)
df = df.drop_duplicates(subset=['客户 ID', '日期'], keep='first')

⚠️ 三、处理异常值:识别并处理离群点

📌 3.1 识别异常值

# 方法 1:3σ原则(正态分布)
mean = df['销售额'].mean()
std = df['销售额'].std()
outliers = df[(df['销售额'] < mean - 3*std) | (df['销售额'] > mean + 3*std)]

# 方法 2:IQR 法(更稳健)
Q1 = df['销售额'].quantile(0.25)
Q3 = df['销售额'].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df['销售额'] < Q1 - 1.5*IQR) | (df['销售额'] > Q3 + 1.5*IQR)]

⚠️ 注意事项:

异常值不一定是错误数据!可能是:

  • 💰 真实的大额交易
  • 👑 VIP 客户的特殊订单
  • 🎉 促销活动的异常高峰

处理前务必业务确认!


📐 四、格式统一:让数据规范化

📌 4.1 日期格式统一

# 转换为标准日期格式
df['日期'] = pd.to_datetime(df['日期'])

# 提取年月日
df['年'] = df['日期'].dt.year
df['月'] = df['日期'].dt.month
df['日'] = df['日期'].dt.day

# 提取星期
df['星期'] = df['日期'].dt.day_name()

📌 4.2 文本格式统一

# 去除空格
df['姓名'] = df['姓名'].str.strip()

# 转大写
df['省份'] = df['省份'].str.upper()

# 转小写
df['邮箱'] = df['邮箱'].str.lower()

# 替换特殊字符
df['手机号'] = df['手机号'].str.replace('-', '').replace(' ', '')

✅ 五、数据验证:确保数据质量

📌 5.1 业务规则验证

# 销售额不能为负数
assert (df['销售额'] >= 0).all(), "存在负数销售额!"

# 数量必须是整数
assert (df['数量'] == df['数量'].astype(int)).all(), "数量不是整数!"

# 日期不能是未来
assert (df['日期'] <= pd.Timestamp.today()).all(), "存在未来日期!"

🎯 六、完整实战案例

def clean_sales_data(df):
    """销售数据清洗完整流程"""

    # 1. 处理缺失值
    df = df.dropna(subset=['客户 ID'])
    df['销售额'].fillna(df['销售额'].median(), inplace=True)

    # 2. 删除重复值
    df.drop_duplicates(inplace=True)

    # 3. 处理异常值
    df = df[df['销售额'] >= 0]

    # 4. 格式统一
    df['日期'] = pd.to_datetime(df['日期'])

    return df

# 执行清洗
df_clean = clean_sales_data(df)
print(f"原始数据:{len(df)} 条")
print(f"清洗后:{len(df_clean)} 条")

🎁 源码下载

关注公众号【数据处理和工作效率】,回复"数据清洗"获取完整代码和数据集!

📌 往期推荐:

  • 🕷️ Python 爬虫入门:3 分钟学会爬取网页数据
  • 📊 Excel+Python 联动:效率提升 10 倍
  • 📈 10 分钟制作专业数据看板

👍 觉得有用,请点赞 + 在看 + 分享!

最新文章

随机文章