找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

697

积分

0

好友

87

主题
发表于 4 小时前 | 查看: 0| 回复: 0

实际工作中获取的原始数据往往混杂着缺失值和重复值,这些“脏数据”会严重影响后续的分析结果。本文将带你掌握使用 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 中为 NaNNone)。处理流程通常分为两步:先定位缺失值,再选择删除或填充

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直接修改

总结

数据清洗是数据分析流程中至关重要的一环。本文详细介绍了使用 PythonPandas 库处理缺失值与重复值的完整流程:对于缺失值,遵循“检测-决策(删/填)”的步骤;对于重复值,则进行快速检测与一键删除。掌握这些基础操作,能有效提升数据质量,确保后续分析结果的准确性。建议读者在 云栈社区Python 等板块进行更多实践,以巩固数据处理技能。接下来可以进一步学习数据筛选、分组聚合等更强大的 Pandas 功能。




上一篇:Claudeception技能进化指南:自动将调试经验转为Claude Code可复用技能
下一篇:马斯克开源X推荐算法源码:基于Transformer架构与Rust/Python技术栈
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 16:14 , Processed in 0.309579 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表