实际工作中获取的原始数据往往混杂着缺失值和重复值,这些“脏数据”会严重影响后续的分析结果。本文将带你掌握使用 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 就是 Pandas 里的“缺失值”,代表空白):
原始带脏数据的表格:
姓名 年龄 城市 工资
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. 三种快速检测缺失值的方法
# 方法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个,“年龄”缺1个,“工资”缺1个,便于快速定位问题所在。
2. 两种核心缺失值处理方法
方法1:直接删除
如果缺失值占比较小,删除后对整体分析影响不大,可以使用 dropna() 方法。
# 删除包含缺失值的行(默认axis=0,删行)
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 都被替换成了合理的值:数值列用集中趋势值,文本列用固定字符,相比删除更能保留数据规模。
处理建议:
- 数值型数据(如年龄、工资):优先考虑使用中位数填充,其对极端值不敏感,结果更稳健。
- 文本型数据(如姓名、城市):通常使用“未知”、“暂无”等固定值进行填充。
- 缺失比例过高(如超过50%):需要考虑是否直接删除该列,因为其提供的信息价值已非常有限。
二、重复值处理:快速检测与删除
完全相同的重复行会导致统计分析结果失真。处理过程同样简单明了:检测后删除。
1. 检测重复值
使用 duplicated() 方法可以标识出重复行(首次出现的行不被视为重复)。
print("="*30)
print("是否有重复行(True=重复):")
print(df.duplicated()) # 每行判断是否为重复行
# 统计重复行数量
print("="*30)
print("重复行数量:")
print(df.duplicated().sum())
运行后会显示具体哪些行是重复的(例如索引为3的行),并给出重复行的总数。
2. 删除重复值
使用 drop_duplicates() 方法可以一键删除重复行。参数 inplace=True 表示直接在原数据上修改,也可以将结果赋值给新变量。
# 基于填充后的数据继续处理(复制一份)
df_clean = df_fill.copy()
# 删除重复行(默认保留第一次出现的行)
df_clean.drop_duplicates(inplace=True)
print("="*30)
print("去重后的最终干净表格:")
print(df_clean)
运行后,完全重复的行(如“张三”的记录)会被删除,最终得到一份既无缺失也无重复的干净数据,为后续分析奠定了良好基础。
三、核心函数速查表
为了方便回顾,以下总结了数据清洗中涉及的核心函数:
| 操作类型 |
检测函数 |
处理函数 |
常用参数说明 |
| 缺失值 |
isnull().sum() |
dropna() |
删除包含缺失值的行 |
|
info() |
fillna(值) |
填充缺失值(均值/固定值等) |
| 重复值 |
duplicated() |
drop_duplicates() |
删除重复行,inplace=True直接修改 |
总结
数据清洗是数据分析流程中至关重要的一环。本文详细介绍了使用 Python 的 Pandas 库处理缺失值与重复值的完整流程:对于缺失值,遵循“检测-决策(删/填)”的步骤;对于重复值,则进行快速检测与一键删除。掌握这些基础操作,能有效提升数据质量,确保后续分析结果的准确性。建议读者在 云栈社区 的 Python 等板块进行更多实践,以巩固数据处理技能。接下来可以进一步学习数据筛选、分组聚合等更强大的 Pandas 功能。