Python数据清洗与处理的常用方法详解

Elena
Elena
发布时间:2026-10-11| 2人浏览过
原创

在数据采集与建模前,原始数据往往存在缺失、重复、异常及格式不统一等干扰因素。通过Python内置的数据处理库,可以按标准化流程自动完成清洗与预处理,显著降低人工校对成本。本文围绕实际业务场景,详细拆解数据清洗与转化的核心步骤,帮助读者快速搭建健壮的数据管道。

核心目标与准备条件

数据清洗的直接目的是消除脏数据对统计分布与模型权重的负面影响。操作前请确认已加载标准依赖库(如pandas与scikit-learn),并确保原始表结构完整。为避免清洗逻辑误伤有效记录,建议在执行覆盖性写入前,先通过副本测试或创建新列保存中间结果。

缺失值处理策略

第1步:删除冗余行与过滤低质量列

当缺失比例极低时,可直接移除包含空值的整行数据;若某字段缺失率超过业务容忍线(例如半数以上为空),则考虑整列剔除以保持表结构精简。

df_dropped = df.dropna()
print("\n删除缺失值后:")
print(df_dropped)

# 保留缺失率低于50%的列
threshold = len(df) * 0.5
df_dropped_cols = df.dropna(axis=1, thresh=threshold)
print("\n删除高缺失率列后:")
print(df_dropped_cols)

第2步:使用固定值或邻近数据进行填充

对于具有明确业务含义的字段(如标题、作者),可使用常量补全;对于数值型字段,采用均值填充能有效维持整体分布。时间序列或有序数据则可借助前后向填充填补断档。

df_filled = df.fillna({
    'title': 'Unknown',
    'author': 'Unknown Author',
    'price': df['price'].mean()
})
print("\n填充缺失值后:")
print(df_filled)

df_ffill = df.fillna(method='ffill')
print("\n前向填充缺失值后:")
print(df_ffill)

df_bfill = df.fillna(method='bfill')
print("\n后向填充缺失值后:")
print(df_bfill)

重复值与异常值控制

第3步:清除与标记重复记录

数据导出合并时极易产生完全重复的行。直接去重可压缩存储体积,而仅做标记则便于追溯数据来源差异。

df_deduplicated = df.drop_duplicates()
print("\n删除重复值后:")
print(df_deduplicated)

df['is_duplicate'] = df.duplicated()
print("\n标记重复值后:")
print(df)

第4步:识别并处置越界异常值

异常值通常由录入错误或极端事件引起。可通过规则拦截后替换为合理统计量,或在特征工程中独立建列标记,避免污染主流模型训练。

# 将超出[0, 100]范围的价格替换为该列均值
df['price'] = df['price'].apply(lambda x: x if 0 <= x <= 100 else df['price'].mean())
print("\n替换异常值后:")
print(df)

# 独立标记异常状态(1为异常,0为正常)
df['is_outlier'] = df['price'].apply(lambda x: 1 if x < 0 or x > 100 else 0)
print("\n标记异常值后:")
print(df)

类型转换与文本清洗

第5步:规范字段格式与清理文本噪声

不同分析工具对数据类型有严格限制。通过显式转换可消除隐式类型冲突,文本清洗则能去除空格、特殊符号与大小写不一致带来的检索干扰。

# 强制转为整型
df['price'] = df['price'].astype(int)
print("\n转换为整数后:")
print(df)

# 安全解析日期,失败值转为NaT
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print("\n转换为日期类型后:")
print(df)

# 去除首尾空白字符
df['title'] = df['title'].str.strip()
print("\n去掉两端空格后:")
print(df)

# 移除非字母数字与空格的特殊字符
df['title'] = df['title'].str.replace('[^a-zA-Z0-9\s]', '', regex=True)
print("\n替换特定字符后:")
print(df)

# 统一转为小写便于匹配
df['title'] = df['title'].str.lower()
print("\n转换为小写后:")
print(df)

数据分组、分箱与标准化

第6步:分组聚合与连续变量离散化

按类别分组计算统计量是探索性分析的基础。针对连续型指标,可利用分箱将其划分为有序等级,便于直观对比或作为分类特征输入。

grouped = df.groupby('author')['price'].mean()
print("\n按作者分组的平均价格:")
print(grouped)

# 定义分箱区间与对应标签(左闭右开)
bins = [0, 10, 20, 30]
labels = ['低', '中', '高']
df['price_level'] = pd.cut(df['price'], bins=bins, labels=labels, right=False)
print("\n按价格分箱后:")
print(df)

第7步:数值范围压缩(归一化)

当特征量纲差异过大时,基于距离或梯度的算法易受绝对值主导。使用MinMaxScaler可将所有数值线性映射至[0, 1]区间,加速收敛并提升模型稳定性。

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df['price_scaled'] = scaler.fit_transform(df[['price']])
print("\n归一化后的数据:")
print(df)

完成判断与排错提示

各步骤执行完毕后,应核对输出数据的形状(行数、列数)、索引对齐情况以及关键字段的非空比例。分箱边界与归一化缩放因子需与下游算法要求保持一致。运行环境若提示FutureWarning关于method='ffill'的弃用信息,属版本迭代正常现象,不影响当前逻辑,生产环境中可迁移至df.ffill()链式调用。如涉及磁盘落盘或覆盖原表,务必提前完成文件备份。

简要总结

数据清洗并非单一命令的堆砌,而是遵循检查 → 修正 → 转化 → 验证的闭环流程。通过合理组合缺失填充、去重标记、异常拦截、格式规范与特征缩放,能够大幅降低脏数据引发的分析偏差。以上就是Python数据清洗与处理的常用方法的详细内容,更多关于数据预处理与特征工程实践的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。