🧹Python 数据清洗实战:搞定缺失值与重复值,让数据干干净净!
在数据分析的世界里,脏数据就像厨房里的油污,会让后续的分析、建模全变味。而 Pandas 作为 Python 数据分析的 “瑞士军刀”,提供了一套超实用的工具,帮你快速搞定数据清洗的两大核心难题 ——缺失值和重复值。
今天这篇干货,带你从 查看缺失值 → 处理缺失值 → 排查删除重复值
🔍 第一步:先摸清家底——查看缺失值
在动手处理之前,我们得先搞清楚:数据里到底有多少缺失值?它们藏在哪些角落?
Pandas 里的 isna() 就是我们的「探照灯」,搭配不同用法,能从多维度快速定位缺失值。
下面我们构造一份带缺失值的示例数据,全程实操演示:
python import pandas as pd import numpy as np # 构造示例数据 data = { "姓名": ["张三", "李四", "王五", "赵六", "孙七"], "年龄": [20, np.nan, 22, np.nan, 24], "分数": [88,92, np.nan, 85, 90], "班级": ["一班", "二班", "三班", "二班", np.nan] } df = pd.DataFrame(data) print(df) |
运行结果:
text 姓名年龄分数班级 0张三20.088.0一班 1李四NaN92.0二班 2王五22.0NaN三班 3赵六NaN85.0二班 4孙七24.090.0NaN |
✨ 1. 按单元格查看:df.isna()
最基础用法,逐个单元格检测,缺失值=True,非缺失值=False,相当于给数据拍了一张缺失值X光片。
python # 按单元格查看缺失值 print(df.isna()) |
运行结果:
text 姓名年龄分数班级 0FalseFalseFalseFalse 1FalseTrueFalseFalse 2FalseFalseTrueFalse 3FalseTrueFalseFalse 4FalseFalseFalseTrue |
✨ 2. 按列查看:df.isna().sum()
数据分析最常用!按列统计每一列缺失值数量,一眼看出哪一列缺失最严重。
python # 按列统计缺失值数量 print(df.isna().sum()) |
运行结果:
text 姓名0 年龄2 分数1 班级1 dtype: int64 |
👉 结果一目了然:年龄列2个缺失,分数、班级各1个,姓名列无缺失。
✨ 3. 按行查看:df.isna().sum(1)
统计每一行有几个缺失值,sum(1) 代表按行维度求和。
python # 按行统计缺失值数量 print(df.isna().sum(1)) |
运行结果:
text 00 11 21 31 41 dtype: int64 |
👉 除第0行外,其余每行都有1个缺失值。
✨ 4. 只看有缺失值的列
数据列很多时,过滤掉无缺失的列,只保留存在缺失的列:
python # 筛选出有缺失值的列 print(df.loc[:, df.isna().any()]) |
✨ 5. 只看有缺失值的行
单独筛选出含缺失值的问题行,方便人工核查:
python # 筛选出有缺失值的行 print(df.loc[df.isna().any(1), :]) |
✨ 6. 统计全局缺失值总数
一键算出整个数据表一共有多少个缺失值:
python # 统计缺失值总个数 print(df.isna().sum().sum()) |
运行结果: 4
🛠️ 第二步:缺失值4种常用处理方式
摸清缺失值分布后,就进入核心清洗环节。日常数据分析,掌握这4种方法完全够用。
1. 删除缺失值 dropna()
适用场景:缺失值占比极低、删除后不影响整体分析。
python # 删除任意包含缺失值的行 df.dropna() # 只删除整行全部为空的行 df.dropna(how="all") # 删除包含缺失值的列 df.dropna(axis=1) # 保留规则:一行至少有3个非空值才保留 df.dropna(thresh=3) |
2. 固定值填充 fillna()
适用场景:类别型数据,统一填充默认标识。
python # 全部缺失值统一填充为0 df.fillna(0) # 指定单列单独填充 df["年龄"].fillna(18) df["班级"].fillna("未知班级") |
3. 统计值填充(均值/中位数/众数)
适用场景:年龄、分数等数值型字段。
python # 均值填充 df["年龄"].fillna(df["年龄"].mean()) # 中位数填充(抗异常值,更稳健) df["年龄"].fillna(df["年龄"].median()) # 众数填充(适合分类字段) df["班级"].fillna(df["班级"].mode()[0]) |
4. 前后值填充
适用场景:时间序列、有先后顺序的有序数据。
python # 前向填充:用上一行值填充 df.fillna(method="ffill") # 后向填充:用下一行值填充 df.fillna(method="bfill") |
🔎 第三步:重复值查看与处理
搞定缺失值,紧接着清理重复值。重复数据会虚增样本、拉低分析准确度,必须排查去重。
1. 查看重复行
python # 判断每行是否为重复行(True=重复) df.duplicated() # 统计一共有多少重复行 df.duplicated().sum() # 只查看重复的行(不含第一条原始数据) df[df.duplicated()] # 查看所有重复行(包含原始行+重复行) df[df.duplicated(keep=False)] |
2. 删除重复值 drop_duplicates()
python # 整行完全一致才去重,默认保留第一条 df.drop_duplicates() # 指定字段去重:只按姓名、年龄判断重复 df.drop_duplicates(subset=["姓名", "年龄"]) # 保留最后一条重复数据 df.drop_duplicates(keep="last") # 原地直接去重,不生成新数据表 df.drop_duplicates(inplace=True) |
✅ 通用万能:一键数据清洗模板
直接复制就能用,适配所有CSV/Excel数据,缺失值+重复值一次性清洗到位:
python import pandas as pd import numpy as np # 读取本地数据 df = pd.read_csv("你的数据.csv") # df = pd.read_excel("你的数据.xlsx") # 1. 快速诊断数据脏况 print("每列缺失值统计:\n", df.isna().sum()) print("重复行总数:", df.duplicated().sum()) # 2. 批量缺失值填充 df["年龄"].fillna(df["年龄"].mean(), inplace=True) df["分数"].fillna(df["分数"].mean(), inplace=True) df["班级"].fillna("未知", inplace=True) # 3. 删除重复行 df.drop_duplicates(inplace=True) # 4. 输出清洗后数据 print("\n✅ 清洗完成后数据:") print(df) |