网站首页 > 技术文章 正文
使用任何数据集之前,都必须进行数据清洗,以便开展进一步分析。常见的数据质量问题包括重复数据、不正确的格式、超出范围的数值以及缺失的数据。
本教程将介绍在Python中用于常见数据清洗任务的一系列单行代码技巧,并以一个示例数据集为基础进行演示。
若想顺利掌握本教程,你需要熟练掌握Python中的列表推导式和字典推导式。让我们开始吧!
生成示例数据
这里是本教程对应的Google Colab笔记本。
首先生成示例数据:
data = [ {"name": "alice smith", "age": 30, "email": "alice@example.com", "salary": 50000.00, "join_date": "2022-03-15"}, {"name": "bob gray", "age": 17, "email": "bob@not-an-email", "salary": 60000.00, "join_date": "invalid-date"}, {"name": "charlie brown", "age": None, "email": "charlie@example.com", "salary": -1500.00, "join_date": "15-09-2022"}, {"name": "dave davis", "age": 45, "email": "dave@example.com", "salary": 70000.00, "join_date": "2021-07-01"}, {"name": "eve green", "age": 25, "email": "eve@example.com", "salary": None, "join_date": "2023-12-31"}, ]
现在,我们尝试编写一些代码来解决示例数据中的问题。
1. 字符串首字母大写标准化
统一数据集中字符串格式很重要。我们将姓名格式统一为首字母大写:
将姓名首字母大写以保持一致性
data = [{**d, "name": d["name"].title()} for d in data]
2. 数据类型转换
为确保分析准确,保持数据类型的一致性至关重要。以下代码将年龄转换为整数,转换失败则默认赋值25:
将年龄转换为整数类型,若转换失败则默认25
data = [{**d, "age": int(d["age"]) if isinstance(d["age"], (int, float)) else 25} for d in data]
3. 数值范围校验
我们还需确保数值在合理范围内。以下代码检查年龄是否在18到60之间,否则赋值为默认年龄25:
确保年龄为18-60之间的整数,否则设为25
data = [{**d, "age": d["age"] if isinstance(d["age"], int) and 18 <= d["age"] <= 60 else 25} for d in data]
4. 邮箱格式校验
文本字段格式问题较常见。以下代码检查邮箱格式是否有效,不符合规范则替换为默认邮箱:
验证邮箱包含"@"和".",否则设为'invalid@example.com'
data = [{**d, "email": d["email"] if "@" in d["email"] and "." in d["email"] else "invalid@example.com"} for d in data]
5. 处理缺失值
缺失值在数据集中较为常见,下述代码检查工资是否缺失,若缺失则赋默认值:
若薪资缺失,则默认设为30,000
data = [{**d, "salary": d["salary"] if d["salary"] is not None else 30000.00} for d in data]
6. 日期格式标准化
统一日期格式有助于分析,以下代码将不同日期格式统一,并对无效日期赋予默认日期:
from datetime import datetime
尝试将日期转为标准格式,若无效则默认'2023-01-01'
data = [{**d, "join_date": (lambda x: (datetime.strptime(x, '%Y-%m-%d').date() if '-' in x and len(x) == 10 else datetime.strptime(x, '%d-%m-%Y').date()) if x and 'invalid-date' not in x else '2023-01-01')(d['join_date'])} for d in data]
但需要注意,这种写法可能不易阅读,建议拆解为多个步骤。推荐阅读:《为何不要过度使用Python列表推导式》,了解更多细节。
7. 移除负数值
有时需要确保特定数值字段(如年龄、工资)为非负值。以下代码将负的工资值替换为0:
将负工资值替换为0,确保所有工资非负
data = [{**d, "salary": max(d["salary"], 0)} for d in data]
8. 去除重复数据
分析数据前需去除重复记录。以下代码基于姓名字段去除重复项:
基于姓名字段去除重复记录
data = {tuple(d.items()) for d in data} # 使用集合去除重复 data = [dict(t) for t in data] # 再转换回字典列表
9. 数值缩放(归一化)
数值缩放有助于统一分析。以下代码将工资缩放为数据集中最高工资的百分比:
将工资值归一化为最高工资的百分比
max_salary = max(d["salary"] for d in data) data = [{**d, "salary": (d["salary"] / max_salary * 100) if max_salary > 0 else 0} for d in data]
10. 字符串去除空格
有时需要去除字符串前后的多余空格,以下代码完成此操作:
去除姓名中首尾空格,数据更整洁
data = [{**d, "name": d["name"].strip()} for d in data]
运行完上述数据清洗步骤后,数据字典变为:
[{'name': 'Bob Gray', 'age': 25, 'email': 'invalid@example.com', 'salary': 85.71428571428571, 'join_date': '2023-01-01'}, {'name': 'Alice Smith', 'age': 30, 'email': 'alice@example.com', 'salary': 71.42857142857143, 'join_date': datetime.date(2022, 3, 15)}, {'name': 'Charlie Brown', 'age': 25, 'email': 'charlie@example.com', 'salary': 0.0, 'join_date': datetime.date(2022, 9, 15)}, {'name': 'Dave Davis', 'age': 45, 'email': 'dave@example.com', 'salary': 100.0, 'join_date': datetime.date(2021, 7, 1)}, {'name': 'Eve Green', 'age': 25, 'email': 'eve@example.com', 'salary': 42.857142857142854, 'join_date': datetime.date(2023, 12, 31)}]
总结
本教程介绍了常见的数据质量问题以及使用 Python 单行代码进行数据清洗的方法。
这些代码在需要快速清洗数据并立即进行分析时非常实用。如果你希望了解pandas库的类似技巧,可以阅读《10个Pandas单行代码技巧,轻松搞定数据访问、操作和管理》。
祝你数据清洗愉快!
猜你喜欢
- 2025-05-11 5 个让代码更干净、更高效的 Python 好习惯
- 2025-05-11 掌握5 个 Python关键程序,编写更清晰、更高效的代码
- 2025-05-11 你应该知道的 50 个 Python 单行代码
- 2025-05-11 如何使用 Python 操作 Git 代码?GitPython 入门介绍
- 2025-05-11 一行代码可以做什么?Python给你答案
- 2025-05-11 应该要看的十条单行Python代码
- 2025-05-11 10 个 Python 单行代码搞定 Scikit-learn 任务,效率提升 80%!
- 2025-05-11 6行Python代码实现进度条效果(tqdm,Progress)
- 2025-05-11 Python进阶-day20: 代码风格与工具
- 2025-05-11 需要知道12 个 Python 单行代码1
- 05-27程序员用 Python 爬取抖音高颜值美女
- 05-27YOLO v3、FaceNet和SVM的人脸检测识别系统源码(python)分享
- 05-27「工具推荐」世界上最简单的人脸识别库 44.7 star
- 05-27开源人脸识别系统源码推荐
- 05-27Go 人脸识别教程
- 05-27Python 深度学习之人脸识别(yolo+facenet)
- 05-27简单的Py人脸识别
- 05-27Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 91℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 82℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)