Pandas 数据清洗(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
引言:数据清洗的重要性
在数据分析和机器学习领域,数据清洗是任何项目成功的关键第一步。就像厨师在烹饪前必须清洗食材一样,未经清洗的数据可能包含缺失值、重复项、格式错误或逻辑矛盾,这些“杂质”会直接影响分析结果的准确性。而 Pandas 数据清洗正是利用 Python 的 Pandas 库,高效完成这一过程的核心工具。
对于编程初学者,Pandas 提供了直观的接口和丰富的函数;对于中级开发者,其灵活性和性能优化则能显著提升工作效率。本文将从基础概念出发,结合实际案例,逐步讲解如何用 Pandas 完成数据清洗的全流程。
一、数据清洗的核心步骤与常见问题
1.1 数据清洗的核心目标
数据清洗的目标是让数据达到“干净、一致、可用”的状态。具体包括:
- 缺失值处理:填补或删除缺失数据
- 重复值清理:识别并删除冗余记录
- 格式标准化:统一数据的存储格式(如日期、货币符号)
- 异常值检测:识别并修正违背逻辑或统计规律的异常数据
1.2 常见数据问题示例
假设我们有一份“用户订单表”,其中可能存在的问题:
| 问题类型 | 具体表现 | 影响 |
|----------|----------|------|
| 缺失值 | 某些用户的“手机号”字段为空 | 导致无法联系用户 |
| 格式错误 | 日期字段存在“2023-02-30”或“30/02/2023” | 计算日期差时出错 |
| 异常值 | 某商品的“销量”为-100 | 歪曲整体销售趋势分析 |
| 重复值 | 同一订单号被多次录入 | 重复计算销售额 |
二、Pandas 数据清洗实战:从基础到进阶
2.1 环境准备与数据加载
首先确保已安装 Pandas:
pip install pandas
加载示例数据(此处使用内置数据集):
import pandas as pd
df = pd.read_csv("sales_data.csv")
print(df.head()) # 查看前5行数据
2.2 处理缺失值:填补与删除
2.2.1 缺失值检测
使用 isnull()
和 sum()
快速统计各列的缺失值数量:
print(df.isnull().sum())
2.2.2 删除缺失值
当缺失比例过高或数据不可靠时,可直接删除:
df_cleaned = df.dropna()
threshold = len(df) * 0.5
df_cleaned = df.dropna(thresh=threshold, axis=1)
2.2.3 填补缺失值
对于少量缺失值,可用均值、中位数或固定值填补:
mean_value = df["Sales"].mean()
df["Sales"].fillna(mean_value, inplace=True)
df["Customer_ID"].fillna("Unknown", inplace=True)
比喻:缺失值就像房间里的空抽屉,我们可以选择直接丢弃(删除)或放入一个“标准物品”(填补)。
2.3 清理重复值:识别与删除
2.3.1 重复值检测
duplicates = df.duplicated().sum()
print(f"重复记录数量:{duplicates}")
2.3.2 删除重复值
保留第一个或最后一个记录:
df = df.drop_duplicates(keep="first")
df = df.drop_duplicates(subset=["Order_ID"], keep="last")
注意:需先分析重复原因,避免误删有效数据(如系统故障导致的重复录入)。
2.4 处理异常值:逻辑与统计方法
2.4.1 逻辑异常值
通过业务规则过滤不合理数据:
df = df[df["Sales"] >= 0]
valid_dates = (df["Order_Date"] >= "2020-01-01") & (df["Order_Date"] <= "2023-12-31")
df = df[valid_dates]
2.4.2 统计方法: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 = df[(df["Sales"] > lower_bound) & (df["Sales"] < upper_bound)]
2.5 数据类型转换与标准化
2.5.1 类型转换
df["Order_Date"] = pd.to_datetime(df["Order_Date"])
df["Price"] = df["Price"].str.replace("$", "").astype(float)
2.5.2 格式标准化
df["Order_Date"] = df["Order_Date"].dt.strftime("%Y-%m-%d")
df["Country"] = df["Country"].str.lower()
2.6 数据合并与关联
当需要整合多源数据时,可使用 merge
或 concat
:
merged_df = pd.merge(df_sales, df_inventory, on="Product_ID", how="inner")
combined_df = pd.concat([df1, df2], axis=0)
三、完整案例:从脏数据到可用数据
3.1 案例背景
假设我们有一份“用户调查表”,原始数据存在以下问题:
- 部分年龄字段为非数字字符
- 邮箱地址包含重复项
- “满意度评分”范围应为1-5分,但存在0分和6分
3.2 清洗步骤
df = pd.read_csv("survey_data.csv")
df["Age"] = pd.to_numeric(df["Age"], errors="coerce")
df["Age"].fillna(df["Age"].median(), inplace=True)
df = df.drop_duplicates(subset=["Email"], keep="first")
df["Satisfaction"] = df["Satisfaction"].clip(lower=1, upper=5)
df["Email"] = df["Email"].str.lower().str.strip()
print(df.info())
四、进阶技巧与工具推荐
4.1 使用 pandas_profiling
自动生成数据报告
from pandas_profiling import ProfileReport
profile = ProfileReport(df, title="数据概况报告")
profile.to_file("report.html")
该工具可快速生成数据分布、缺失值比例等可视化报告,辅助清洗决策。
4.2 自定义清洗函数
对于复杂逻辑,可编写函数封装清洗步骤:
def clean_data(df):
df = df.dropna(subset=["关键列"])
df["数值列"] = df["数值列"].apply(lambda x: max(x, 0)) # 确保非负
return df
结论
通过本文的讲解,我们系统学习了 Pandas 数据清洗的核心方法,包括缺失值处理、重复值清理、异常值检测等。数据清洗不仅是技术问题,更是对业务逻辑的理解过程。对于初学者,建议从简单数据集入手,逐步掌握关键函数;中级开发者则可结合自动化工具(如 pandas-profiling
)提升效率。
记住:“垃圾进,垃圾出”(Garbage In, Garbage Out),只有经过严谨清洗的数据,才能为分析和预测提供可靠的基础。现在,不妨打开你的 Python 环境,尝试清洗一份真实数据吧!