目 录CONTENT

文章目录

从混乱到整洁:8个Python技巧助您轻松完成数据预处理

Administrator
2026-02-19 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://www.kdnuggets.com/from-messy-to-clean-8-python-tricks-for-effortless-data-preprocessing

原文作者:Iván Palomares Carrascosa


Concept art illustrating data preprocessing: messy data becoming clean and organized, minimalistic styleImage by Editor

 

# 引言

尽管数据预处理在数据科学和机器学习工作流程中具有重要的相关性,但由于这些过程通常被认为是过于复杂、耗时或需要大量的自定义代码,因此它们往往没有得到正确的执行。结果是,从业者可能会推迟基本任务,例如数据清洗,依赖于长期不可持续的脆弱的临时解决方案,或者对本质上可能很简单的问题过度设计解决方案。


本文将介绍8个Python技巧,以最少的努力将原始、混乱的数据转化为整洁、规范化的数据。


在查看具体的技巧和随附的代码示例之前,以下前奏代码设置了必要的库并定义了一个玩具数据集,以说明每个技巧:

import pandas as pd
import numpy as np
# 一个刻意设置得很混乱的微型数据集
df = pd.DataFrame({
    " User Name ": [" Alice ", "bob", "Bob", "alice", None],
    "Age": ["25", "30", "?", "120", "28"],
    "Income$": ["50000", "60000", None, "1000000", "55000"],
    "Join Date": ["2023-01-01", "01/15/2023", "not a date", None, "2023-02-01"],
    "City": ["New York", "new york ", "NYC", "New York", "nyc"],
})

 

# 1. 瞬间标准化列名

这是一个非常实用的单行代码技巧:它可以在一行代码中标准化数据集中所有列的名称。具体操作取决于你希望如何标准化属性的名称,但下面的示例展示了如何将空格替换为下划线并将所有内容小写,从而确保一致的、标准化的命名约定。这对于防止下游任务中出现烦人的错误或修复可能的拼写错误非常重要。无需逐列迭代!

df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")

 

# 2. 规模化剥离字符串中的空格

有时你可能只想确保特定的人眼看不见的“垃圾”字符,比如字符串(分类)值开头或结尾的空格,能在整个数据集中被系统地删除。这个策略可以整齐地对所有包含字符串的列执行此操作,同时保持其他列(如数值列)不变。

df = df.apply(lambda s: s.str.strip() if s.dtype == "object" else s)

 

# 3. 安全地转换数值列

如果我们不能100%确定数值列中的所有值都遵循相同的格式,通常最好明确地将这些值转换为数字格式,将那些看起来像数字的混乱字符串变成真正的数字。只需一行代码,我们就可以完成原本需要try-except块和更手动清洗过程的工作。

df["age"] = pd.to_numeric(df["age"], errors="coerce")
df["income$"] = pd.to_numeric(df["income$"], errors="coerce")

 

请注意,其他经典方法,如df['columna'].astype(float),如果遇到无法轻易转换为数字的无效原始值,有时可能会导致程序崩溃。

 

# 4. 使用 errors='coerce' 解析日期

类似于验证过程,但针对不同的数据类型。此技巧会将有效的日期时间值转换为日期时间对象,而将无效的值置空。使用errors='coerce'是关键,它告诉Pandas,如果在执行过程中发现无效的、不可转换的值,应将其转换为NaT(Not a Time),而不是产生错误并使程序崩溃。

df["join_date"] = pd.to_datetime(df["join_date"], errors="coerce")

 

# 5. 使用智能默认值修复缺失值

对于不熟悉除删除包含缺失值的那一行之外的其他处理缺失值策略的人来说,此策略使用统计驱动的默认值(如medianmode)来插补(填充)缺失值。这是一种高效的、基于单行代码的策略,可以根据不同的默认聚合方式进行调整。mode旁边的[0]索引用于在“最常见值”之间出现并列时,仅获取一个值。

df["age"] = df["age"].fillna(df["age"].median())
df["city"] = df["city"].fillna(df["city"].mode()[0])

 

# 6. 使用 Map 标准化类别

在类别列(如城市)中存在不同值时,标准化名称并合并可能的差异也是必要的,目的是获得更清晰的分组名称,并使下游的分组聚合(如groupby())可靠和有效。借助字典,此示例对与纽约市相关的字符串值应用一对一映射,确保所有这些值都统一表示为“NYC”。

city_map = {"new york": "NYC", "nyc": "NYC"}
df["city"] = df["city"].str.lower().map(city_map).fillna(df["city"])

 

# 7. 明智且灵活地删除重复项

这种高度可定制的重复删除策略的关键在于使用subset=["user_name"]。在此示例中,它用于告诉 Pandas 只查看"user_name"列来判断一行是否是重复项,并通过检查该列中的值是否与另一行中的值相同。这是确保数据集中每个唯一用户只出现一次的绝佳方式,可以防止重复计数,并且所有操作都在一条指令中完成。

df = df.drop_duplicates(subset=["user_name"])

 

# 8. 使用分位数裁剪(Clipping)移除异常值

最后一个技巧是自动限制极端值或异常值,而不是完全删除它们。当异常值被假定是由于数据中手动引入的错误而产生时,这一点尤其有用。裁剪(Clipping)会将低于(和高于)两个百分位数(示例中为1%和99%)的极端值设置为与该百分位数相等的值,同时保持位于这两个指定百分位数之间的原始值不变。简单来说,就是将过大或过小的数值限制在特定范围内。

q_low, q_high = df["income$"].quantile([0.01, 0.99])
df["income$"] = df["income$"].clip(q_low, q_high)

 

# 总结

本文展示了八个有用的技巧、窍门和策略,它们将提高您在Python中的数据预处理管道的效率、有效性和稳健性,并且是同时实现的。


Iván Palomares Carrascosa是一位在人工智能、机器学习、深度学习和LLM领域的领导者、作家、演讲者和顾问。他培训并指导他人如何在现实世界中利用人工智能。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区