
一、引言
尽管数据预处理在数据科学和机器学习工作流中具有重要意义,但这些过程往往无法正确执行——主要是因为人们认为它们过于复杂、耗时,或者需要大量自定义代码。因此,从业者可能会推迟数据清理等必要任务,依赖脆弱的临时解决方案(从长远来看不可持续),或者对本质上可能很简单的问题过度设计解决方案。
本文将介绍8个Python技巧,让你以最小的 effort 将原始、杂乱的数据转换为干净、整齐的预处理数据。
在查看具体技巧和相应的代码示例之前,以下前置代码会设置必要的库,并定义一个模拟数据集来说明每个技巧:
import pandas as pd
import numpy as np
# 一个小型的、特意设置得杂乱的数据集
df = pd.Datafr ame({
" 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"],
})
二、瞬间标准化列名
这是一个非常实用的单行代码技巧:只需一行代码,就能标准化数据集中所有列的名称。具体操作取决于你希望如何标准化属性名称,但以下示例展示了如何将空格替换为下划线,并将所有字符转换为小写,从而确保一致、标准化的命名规范。这对于防止下游任务中出现恼人的错误或修正可能的拼写错误至关重要,无需逐列迭代!
df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
三、批量去除字符串中的空格
有时你可能只想确保系统地移除整个数据集中所有字符串(分类)值开头或结尾的、人眼不可见的无用字符(如空格)。这种方法可以巧妙地对所有包含字符串的列执行此操作,而不改变其他列(如数值列)。
df = df.apply(lambda s: s.str.strip() if s.dtype == "ob ject" else s)
四、安全转换数值列
如果我们不能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))有时会崩溃——如果遇到无法轻松转换为数值的无效原始值。
五、使用errors='coerce'解析日期
这是一种类似的面向验证的过程,但针对不同的数据类型。这个技巧会转换有效的日期时间值,将无效的值设为缺失值。使用errors='coerce'是关键——它告诉Pandas,如果发现无效、无法转换的值,应将其转换为NaT(非时间值),而不是在执行过程中产生错误并崩溃程序。
df["join_date"] = pd.to_datetime(df["join_date"], errors="coerce")
六、使用智能默认值修复缺失值
对于那些除了删除包含缺失值的整行之外,不熟悉其他缺失值处理策略的人来说,这种策略会使用统计驱动的默认值(如中位数或众数)来填充这些缺失值。这是一种高效的、基于单行代码的策略,可以通过不同的默认聚合函数进行调整。众数(mode)后面的[0]索引用于在两个或多个“最频繁值”出现平局时,仅获取一个值。
df["age"] = df["age"].fillna(df["age"].median())
df["city"] = df["city"].fillna(df["city"].mode()[0])
七、使用Map标准化分类值
在包含多种值的分类列中(如城市列),标准化名称并消除可能的不一致性也很有必要——这样可以获得更干净的分组名称,并使下游的分组聚合(如groupby())可靠且有效。在字典的辅助下,以下示例对与纽约市相关的字符串值应用一对一映射,确保所有值都统一表示为“NYC”。
city_map = {"new york": "NYC", "nyc": "NYC"}
df["city"] = df["city"].str.lower().map(city_map).fillna(df["city"])
八、灵活明智地删除重复项
这种高度可定制的重复项删除策略的关键是使用subset=["user_name"]。在这个示例中,它用于告诉Pandas,只有通过查看“user_name”列,并验证该列中的值是否与另一行中的值相同,才能将一行视为重复项。这是确保数据集中每个唯一用户仅出现一次的好方法,可防止重复计数,并且只需一条指令就能完成。
df = df.drop_duplicates(subset=["user_name"])
九、裁剪分位数以去除异常值
最后一个技巧是自动限制极端值或异常值,而不是将它们完全删除。例如,当异常值被认为是由于数据中手动引入的错误时,这一点特别有用。裁剪(clipping)会将低于和高于两个分位数(示例中为1%和99%)的极端值设置为这两个分位数的值,而保留位于两个指定分位数之间的原始值不变。简单来说,这就像是将过大或过小的值限制在合理范围内。
q_low, q_high = df["income$"].quantile([0.01, 0.99])
df["income$"] = df["income$"].clip(q_low, q_high)
十、总结
本文介绍了8个实用的技巧、窍门和策略,将提升你在Python中的数据预处理流水线,使其同时更高效、更有效且更稳健。
推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !



雷达卡





京公网安备 11010802022788号







