77_Python数据清洗实战技巧
Python数据清洗实战从脏数据到干净数据文章目录Python数据清洗实战从脏数据到干净数据前言一、缺失值检测与处理二、重复值处理三、数据类型转换四、apply函数灵活的数据变换五、异常值处理总结✅ 亮点总结适用场景扩展方向前言真实世界中的数据往往是脏的缺失值、重复记录、不一致的格式、异常值……这些问题如果不经过处理就投入分析轻则得出错误结论重则导致业务决策失误。数据分析和机器学习领域有一句名言“Garbage In, Garbage Out”——再好的模型也救不了脏数据。数据清洗是数据分析流程中耗时最长通常占70%-80%的时间但也是最关键的一步。本文聚焦pandas中数据清洗的六大核心技巧通过实战代码带你彻底搞定脏数据建立标准化的清洗流程。面试实录“你如何处理一份有50%缺失值的数据”——这不是一个简单的用均值填充的问题。面试官想听到的是你根据场景做决策的能力先分析缺失原因随机缺失还是系统缺失再判断能否通过其他字段推导最后选择删除、填充或保留为特殊类别的策略。这篇文章会帮你建立这种分析思维。一、缺失值检测与处理缺失值是数据清洗中最常见的问题。在pandas中None和np.nan都被视为缺失值。了解缺失值的分布——哪些列缺失、缺失比例是多少——是决定处理策略的前提。首先要了解缺失值的分布情况importpandasaspdimportnumpyasnp dfpd.DataFrame({姓名:[张三,李四,np.nan,赵六,孙七],年龄:[25,np.nan,28,35,np.nan],薪资:[15000,20000,np.nan,np.nan,22000],部门:[技术,销售,技术,None,销售],绩效:[85.5,90.0,78.0,88.5,None],})# 检测缺失值print(df.isnull().sum())# 每列缺失数量print(df.isnull().sum().sum())# 总缺失数量print(df[df[薪资].isnull()])# 薪资缺失的行isnull() vs notnull()isnull()返回布尔DataFrameTrue表示缺失配合sum()可以统计每列缺失数。isnull().sum().sum()统计全部缺失值总数。notnull()是isnull()的反向操作。在实际项目中通常先算缺失比例df.isnull().sum() / len(df)设定阈值决定是删除该列、删除该行还是填充。缺失值检测完成后有三种主流处理策略——删除、填充和插值。选择哪种策略取决于缺失比例和业务含义# 策略一删除缺失值df_dropnadf.dropna()# 删除含任何缺失值的行df_drop_alldf.dropna(howall)# 删除全为缺失值的行df_drop_subdf.dropna(subset[薪资])# 仅关注特定列df_drop_threshdf.dropna(thresh4)# 至少有4个非空值才保留# 策略二填充缺失值df[年龄]df[年龄].fillna(df[年龄].mean())# 均值填充df[部门]df[部门].fillna(未知)# 固定值填充df[薪资]df[薪资].fillna(methodffill)# 前向填充用前一行的值df[薪资]df[薪资].fillna(methodbfill)# 后向填充# 策略三插值法填充适合时间序列df[年龄]df[年龄].interpolate(methodlinear)删除 vs 填充的选择依据如果缺失比例很低5%删除缺失行通常损失不大但如果一组关键列如薪资缺失超过30%且无法从其他数据中推断删除该列可能更合适。填充策略中均值填充适合对称分布的数据中位数填充适合有偏分布因为中位数不受极端值影响众数填充适合分类数据。fillna的method参数ffill前向填充和bfill后向填充来自pandas中fillna的方法参数适合时间序列或有序数据——比如用前一天的温度填充今天的缺失值。interpolate()则做线性插值在两个已知值之间按距离比例估算中间值比简单的前向/后向填充更精确。二、重复值处理重复数据通常来自数据采集的多次提交、日志重复记录或多源数据合并时的交叉。去重看似简单实际需要判断什么是真正的重复——是按所有列完全相同才算重复还是某几个关键字段相同就算重复# 创建含重复的数据df.duplicated().sum()# 统计重复行数量print(df[df.duplicated()])# 查看重复行print(df[df.duplicated(keepFalse)])# 显示所有重复行# 删除重复值df_uniquedf.drop_duplicates()# 全部列重复才删除df_uniquedf.drop_duplicates(subset[姓名])# 按指定列去重df_uniquedf.drop_duplicates(subset[姓名],keepfirst)# 保留第一个df_uniquedf.drop_duplicates(subset[姓名],keeplast)# 保留最后一个df_uniquedf.drop_duplicates(subset[姓名],keepFalse)# 全不保留duplicated() 的工作原理默认情况下duplicated()将第一条出现的记录标记为False不重复后续相同的记录标记为True重复。keeplast则反过来保留最后一条。keepFalse把所有重复记录全部标记为True方便查看所有重复项。实际陷阱去重前一定要明确重复的定义。比如用户表中有两条张三但手机号不同——这可能是两个同名的人也可能是同一个人换了手机号。按姓名去重会误删数据。所以在实际业务中应使用ID、手机号等唯一标识字段来去重。三、数据类型转换正确的数据类型是高效计算的前提。pandas在读取数据时会自动推断类型但推断结果不一定准确——比如数字中混入了符号被误判为字符串类型。显式检查和转换类型是数据清洗的必要步骤。# 查看列类型print(df.dtypes)# 字符串转数值df[年龄]pd.to_numeric(df[年龄],errorscoerce)# 数值转类别df[部门]df[部门].astype(category)# 字符串转日期df[入职日期]pd.to_datetime(df[入职日期],format%Y-%m-%d)# 类型转换通用方法df[薪资]df[薪资].astype(float64)df[ID]df[ID].astype(int64)# 同时转换多列dfdf.astype({年龄:int64,薪资:float64,部门:category})# 处理转换异常df[年龄]df[年龄].apply(lambdax:pd.to_numeric(x,errorscoerce)ifisinstance(x,str)elsex)errors‘coerce’ 的作用当字符串无法转换时coerce会将其置为NaN而不是抛出异常。这是批量类型转换中最安全的参数。如果你希望严格校验——任何无法转换的值都应该报错提醒——可以使用errorsraise。category 类型的优势将重复值很多的列如部门只有技术/销售/市场三个值转换为category类型可以大幅节省内存可能减少90%以上同时加速分组和排序操作。对于大规模数据这是一个低成本高回报的优化。四、apply函数灵活的数据变换apply()是pandas极其强大的工具可以对每一行或每一列应用自定义函数# 对列应用函数df[薪资等级]df[薪资].apply(lambdax:高ifx20000else低)# 定义复杂函数defcategorize_salary(salary,dept):ifpd.isna(salary):return未知ifdept技术:return高ifsalary18000else中else:return高ifsalary20000else中df[薪资等级]df.apply(lambdarow:categorize_salary(row[薪资],row[部门]),axis1)# 批量文本清理df[姓名]df[姓名].apply(lambdax:str(x).strip()ifpd.notna(x)elsex)df[部门]df[部门].str.replace( ,).str.upper()axis1 vs axis0df.apply(func, axis1)按行应用每行作为一个Series传给funcaxis0按列应用。对于需要同时访问多列数据的场景如根据薪资和部门一起判断等级必须用axis1。但要注意axis1的性能比axis0差很多——大型DataFrame上慎用。str访问器df[部门].str是pandas为字符串列提供的专用访问器支持.replace()、.upper()、.split()等字符串方法。它在内部做向量化操作比apply(lambda x: x.upper())快很多。五、异常值处理# IQR方法检测异常值Q1df[薪资].quantile(0.25)Q3df[薪资].quantile(0.75)IQRQ3-Q1 lower_boundQ1-1.5*IQR upper_boundQ31.5*IQR outliersdf[(df[薪资]lower_bound)|(df[薪资]upper_bound)]print(f异常值数量:{len(outliers)})# 处理异常值df_clippeddf.copy()df_clipped[薪资]df_clipped[薪资].clip(lower_bound,upper_bound)# 截断# Z-Score方法fromscipyimportstats z_scoresstats.zscore(df[薪资].dropna())outliers_zdf[薪资].dropna()[abs(z_scores)3]IQR vs Z-Score的选择IQR方法基于四分位数对数据分布没有假设适合任意形状的分布是业界默认的稳健方法。Z-Score方法假设数据近似正态分布超过3个标准差视为异常。如果数据有偏分布如薪资往往右偏IQR的鲁棒性更好。异常值不一定都要删除有些异常值可能是业务最有价值的数据——比如高价值客户、峰值流量事件。处理方法除了删除和截断还可以单独拎出来做专项分析或者用对数变换压缩量级。不要机械地删除所有超出上下界的记录。defclean_data(df):标准化数据清洗流程dfdf.copy()# 1. 去除首尾空格str_colsdf.select_dtypes(includeobject).columnsforcolinstr_cols:df[col]df[col].str.strip()# 2. 处理缺失值df[数值列]df[数值列].fillna(df[数值列].median())df[类别列]df[类别列].fillna(未知)# 3. 去重beforelen(df)dfdf.drop_duplicates()print(f去重:{before}-{len(df)}条记录)# 4. 类型转换df[日期列]pd.to_datetime(df[日期列])# 5. 异常值处理numeric_colsdf.select_dtypes(includenumber).columnsforcolinnumeric_cols:mean,stddf[col].mean(),df[col].std()dfdf[df[col].between(mean-3*std,mean3*std)]returndf# 使用df_cleanclean_data(df)总结数据清洗没有万能公式但有一套标准化的方法论检测-决策删/填/转/去重/降噪-验证。本文涵盖了缺失值处理、重复值去重、类型转换、apply灵活变换、异常值处理的完整工具链。建议在每次分析前都执行一到两遍清洗流程并在清洗前后分别用df.describe()和df.info()对比数据特征确保清洗操作符合预期。✅ 亮点总结缺失值处理覆盖了删除dropna、填充fillna和插值三种策略应对不同业务场景drop_duplicates()配合subset/keep参数可精确控制去重逻辑astype()与pd.to_numeric(errorscoerce)是解决数据类型混乱的核心工具IQR法则Q1-1.5×IQR, Q31.5×IQR提供了统计意义上的异常值检测标准将清洗流程封装为可复用函数告别每次手写重复代码的低效工作方式适用场景数据分析项目预处理拿到一份脏数据后执行标准化清洗流程再做分析数据迁移与整合从多个外部系统导入数据时统一清洗格式、剔除无效记录自动化ETL任务编写定时脚本自动完成数据抽取、清洗、转换和入库扩展方向正则表达式进阶清洗学习str.extract()、str.replace()处理非结构化文本字段大规模数据清洗使用chunksize参数分块读取和清洗超大文件避免内存溢出推荐阅读下一篇《Python数据可视化matplotlib》将清洗后的数据用图表直观呈现

相关新闻

鱼眼镜头4种投影模型对比:等距/正交/等立体角/体视畸变差异解析

鱼眼镜头4种投影模型对比:等距/正交/等立体角/体视畸变差异解析

鱼眼镜头四大投影模型深度解析:从数学原理到工程实践鱼眼镜头以其超广视角特性在计算机视觉、无人机导航、虚拟现实等领域大放异彩。当普通镜头难以捕捉超过90的场景时,鱼眼镜头的180甚至270视场角成为无可替代的选择。但这份"广角超能力"背后…

2026/7/6 8:09:41阅读更多 →
Three.js 物理cannon使用教程

Three.js 物理cannon使用教程

物理cannon使用 Physics Mesh ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 OrbitControls…

2026/7/6 8:09:41阅读更多 →
不用加装基站标签,纯视觉视频孪生实现全域厘米级无感定位

不用加装基站标签,纯视觉视频孪生实现全域厘米级无感定位

不用加装基站标签,纯视觉视频孪生实现全域厘米级无感定位研发主体:镜像视界浙江科技有限公司 权威资质:国家十四五重点课题研究、镜像视界浙江普陀时空大数据应用技术联合研究院联合研发、河南省电检院权威机构认证 技术定位:行业…

2026/7/6 8:04:41阅读更多 →
Plone无代码主题切换:Diazo静态主题Web界面配置全指南

Plone无代码主题切换:Diazo静态主题Web界面配置全指南

1. 项目概述:把静态HTML主题“活”进Plone后台,不碰代码也能换皮肤 你手头有一套设计精美的静态HTML/CSS网站模板——可能是UI设计师给的交付物,也可能是从ThemeForest买来的响应式主题,甚至是你自己用Figma导出的纯前端页面。现在…

2026/7/6 10:25:49阅读更多 →
R语言H-1B数据采集实战:绕过反爬构建可审计数据流水线

R语言H-1B数据采集实战:绕过反爬构建可审计数据流水线

1. 项目概述:用R语言抓取并解析H-1B签证数据,不是写爬虫,是做数据考古“Web Scraping and Parsing Data in R | Exploring H-1b Data Pt. 1”这个标题乍看像一门编程课的作业标题,但实际操作起来,它是一次典型的“现实…

2026/7/6 10:25:49阅读更多 →
Plone静态主题转Diazo:Web界面零代码主题集成指南

Plone静态主题转Diazo:Web界面零代码主题集成指南

1. 项目概述:把静态HTML主题“活”成Plone的Diazo主题 你手头有一套设计精美的静态HTML/CSS/JS主题——可能是从ThemeForest买的商业模板,也可能是设计师交付的Figma转码成果,甚至是你自己用Bootstrap写的响应式页面。它结构清晰、视觉惊艳、…

2026/7/6 10:25:49阅读更多 →
BeautifulSoup网页解析底层原理与抗干扰实战指南

BeautifulSoup网页解析底层原理与抗干扰实战指南

1. 这不是“学个库就完事”的速成课,而是一场网页解析思维的重建 你点开这篇内容,大概率正被某个网页数据卡住:想抓取电商页面的商品价格却只拿到一堆乱码标签,爬取新闻列表时发现标题和发布时间总对不上行,或者更糟—…

2026/7/6 10:25:49阅读更多 →
BeautifulSoup网页解析入门:HTML结构化提取实战指南

BeautifulSoup网页解析入门:HTML结构化提取实战指南

1. 项目概述:这不是“学个库”,而是打开网页数据世界的钥匙 你有没有过这样的时刻:在浏览器里看到一份整齐的课程表、实时更新的房价列表、某电商网站上成千上万的商品参数,或者某政府公开平台里结构清晰的招标公告——心里清楚这…

2026/7/6 10:25:49阅读更多 →
YOLOv10模型改进-Backbone改进-第62篇:YOLOv10改进策略【Backbone】| EfficientNet-Lite Backbone替换

YOLOv10模型改进-Backbone改进-第62篇:YOLOv10改进策略【Backbone】| EfficientNet-Lite Backbone替换

一、本文介绍 本文记录的是利用EfficientNet-Lite作为Backbone改进YOLOv10的特征提取部分。EfficientNet-Lite是EfficientNet的轻量化版本,适合移动端部署。 二、EfficientNet-Lite模块介绍 2.1 设计出发点 标准EfficientNet使用Swish激活函数和深度可分离卷积,Efficient…

2026/7/6 10:20:48阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行:官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南在数据分析和处理领域,去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时,不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

2026/7/6 0:03:39阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →