时间:26-04-25
欢迎回到我们的Pandas系列。在前两期打好基础后,我们现在要直面数据处理中最关键的环节——数据清洗。缺失值与重复值是影响分析准确性的两大常见问题,本文将为你提供清晰、可复现的解决方案。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
(前文回顾:《Pandas 入门一:零基础也能懂!3步安装+10分钟玩转数据读取》《Pandas 入门二:DataFrame 核心操作,新手也能轻松筛选/修改数据》)
现实世界的数据集很少是完美无瑕的。原始数据中常存在空白单元格(缺失值)或完全相同的记录行(重复值)。这些数据质量问题若不解决,将直接扭曲后续的分析结果。本文将引导你使用Pandas高效地完成这两项核心清洗任务。
首先,我们导入Pandas并创建一个包含典型数据质量问题的示例DataFrame。运行以下代码,生成用于练习的数据集。
import pandas as pd
# 创建带缺失值、重复值的示例数据(模拟真实场景)
data = {
‘姓名’: [‘张三’, ‘李四’, ‘王五’, ‘张三’, None, ‘赵六’], # None表示缺失值
‘年龄’: [25, 30, None, 25, 35, 35], # 空白单元格对应None
‘城市’: [‘北京’, ‘上海’, ‘广州’, ‘北京’, ‘深圳’, ‘深圳’],
‘工资’: [8000, 12000, 10000, 8000, None, 10000]
}
# 转为DataFrame(表格格式)
df = pd.DataFrame(data)
print(“原始带脏数据的表格:”)
print(df)
执行代码后,你将看到一个包含NaN(Not a Number,表示缺失)和重复行的DataFrame。在Pandas中,NaN即代表缺失值。
原始带脏数据的表格:
姓名 年龄 城市 工资
0 张三 25.0 北京 8000.0
1 李四 30.0 上海 12000.0
2 王五 NaN 广州 10000.0
3 张三 25.0 北京 8000.0 # 这行是重复值
4 None 35.0 深圳 NaN
5 赵六 35.0 深圳 10000.0
缺失值指数据表中的空单元格,在Pandas中显示为NaN或None。标准处理流程分为两步:首先定位缺失值,然后选择删除或填充。
# 方法1:查看每列缺失值的数量(最常用)
print(“=“*30)
print(“每列缺失值数量:”)
print(df.isnull().sum()) # isnull()判断是否为缺失值,sum()统计个数
# 方法2:查看缺失值占比(更直观)
print(“=“*30)
print(“每列缺失值占比:”)
print((df.isnull().sum() / len(df)).round(2)) # 除以总行数,保留2位小数
# 方法3:快速查看数据整体情况(包含缺失值)
print(“=“*30)
print(“数据整体信息:”)
df.info() # 会显示每列非空值数量、数据类型
运行上述代码,可以快速定位到“姓名”、“年龄”、“工资”列各存在一个缺失值。这为后续处理提供了明确目标。
(1) 删除缺失值(适用于缺失比例较低的情况)
当缺失记录数量很少时,最直接的方法是删除包含缺失值的行。使用dropna()方法实现。
# 删除包含缺失值的行(默认axis=0,删行;axis=1删列,不常用)
df_drop = df.dropna()
print(“=“*30)
print(“删除缺失值后的表格:”)
print(df_drop)
操作后,所有包含NaN的行将被移除,得到一个完整的数据子集。
(2) 填充缺失值(适用于缺失比例较高或需要保留数据量的情况)
若缺失值较多,直接删除会导致样本量大幅减少,此时应考虑填充。核心思路是用合理的估计值替换缺失位置,使用fillna()方法。
# 复制原始数据,避免修改原数据(新手好习惯)
df_fill = df.copy()
# 1. 数值型列(年龄、工资):用均值/中位数填充(更合理)
df_fill[‘年龄’] = df_fill[‘年龄’].fillna(df_fill[‘年龄’].mean()) # 均值填充
df_fill[‘工资’] = df_fill[‘工资’].fillna(df_fill[‘工资’].median()) # 中位数填充
# 2. 文本型列(姓名):用固定值填充(比如“未知”)
df_fill[‘姓名’] = df_fill[‘姓名’].fillna(‘未知’)
print(“=“*30)
print(“填充缺失值后的表格:”)
print(df_fill)
现在,所有NaN已被替换:年龄列使用平均值填充,工资列采用更稳健的中位数填充,姓名列则标记为“未知”。此方法在解决数据缺失问题的同时,最大程度保留了数据规模。
操作要点:
重复值指在所有列上内容完全一致的行(如示例中的两个“张三”记录)。它们会导致统计结果失真,必须清理。处理流程同样是先检测,后清除。
print(“=“*30)
print(“是否有重复行(True=重复):”)
print(df.duplicated()) # 每行判断是否为重复行(第一次出现的行算不重复)
# 统计重复行数量
print(“=“*30)
print(“重复行数量:”)
print(df.duplicated().sum())
运行代码,系统会标识出第3行(索引3)为重复行,并显示总的重复数量为1。
使用drop_duplicates()方法可一键清除所有重复项。你可以选择使用inplace=True参数直接修改原DataFrame,或将结果赋值给新变量。
# 复制填充后的表格(继续处理重复值)
df_clean = df_fill.copy()
# 删除重复行(默认保留第一次出现的行)
df_clean.drop_duplicates(inplace=True)
print(“=“*30)
print(“去重后的最终干净表格:”)
print(df_clean)
至此,多余的“张三”行已被移除。我们获得了一份既无缺失值也无重复值的洁净数据表,为后续分析奠定了可靠基础。
本文系统讲解了Pandas数据清洗的两大核心操作:处理缺失值遵循“先检测,后处理(删除或填充)”的流程;处理重复值则是“一键检测,一键删除”。请务必跟随代码逐步操作,以形成牢固的操作记忆。
洁净的数据是任何深度分析的基石。缺失值与重复值处理是数据预处理中最高频的操作之一。建议反复练习本文的代码示例,直至熟练掌握。在接下来的教程中,我们将深入Pandas的进阶功能,探索数据筛选、分组与聚合,你会发现其效率远超手动操作。