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 数据合并与关联

当需要整合多源数据时,可使用 mergeconcat

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 环境,尝试清洗一份真实数据吧!

最新发布