📊 做数据分析的朋友都知道一句话:"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)
💡 实战建议:
🔄 二、处理重复值:精准去重
📌 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)]
⚠️ 注意事项:
异常值不一定是错误数据!可能是:
处理前务必业务确认!
📐 四、格式统一:让数据规范化
📌 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 倍
👍 觉得有用,请点赞 + 在看 + 分享!