【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在这里插入图片描述

Python 是最受欢迎的数据科学编程语言

Python 之所以成为数据科学领域中最受欢迎的编程语言,是因为它功能多样,并且拥有强大的社区支持。由于应用广泛,我们在数据科学工作流中其实有很多提升效率的方法,而其中一些你可能还未曾了解。

本文将介绍 10 个能够提升数据科学工作效率的 Python 单行代码。

1. 高效处理缺失数据

缺失数据在数据集中十分常见。它可能源于数据管理不善、自然条件等多种原因。但无论如何,我们都需要决定如何处理这些缺失数据。

常见的做法是将其标记为缺失类别,或者直接删除。但在某些情况下,我们更倾向于填补缺失值。

如果我们希望填补缺失值,可以使用 Pandas 的 fillna 方法。它的用法很简单,只需传入替换缺失值的填充值即可。

不过我们可以让它更高效:

df.fillna({col: df[col].median() for col in df.select_dtypes(include='number').columns} |
          {col: df[col].mode()[0] for col in df.select_dtypes(include='object').columns}, inplace=True)

通过将 fillna 与条件结合,我们可以用中位数填补数值型缺失数据,用众数填补类别型缺失数据。

只需一行代码,就能快速填补不同列中的各种缺失数据。

2. 移除高度相关特征

当数据集中存在大量彼此高度相关的自变量时,会产生多重共线性(multicollinearity),这会对模型性能产生负面影响。因此,我们希望保留相关性较低的特征。

我们可以结合 Pandas 的相关性计算与条件筛选,快速挑选出相关性较低的特征。例如,下面的代码可以保留与其他特征的最大 Pearson 相关系数低于 0.95 的特征:

df = df.loc[:, df.corr().abs().max() < 0.95]

通过尝试不同的相关性阈值,可以观察模型预测性能是否有所提升。

3. 条件列计算(Conditional Column Apply)

在创建新列时,如果需要基于多个条件进行计算,往往会写出较长的代码。但借助 Pandas 的 apply 方法,我们可以在生成新特征时灵活应用条件,同时使用多列的数值。

例如,下面的代码创建了一个新列 new_col,其值基于其他列的条件:

df['new_col'] = df.apply(lambda x: x['A'] * x['B'] if x['C'] > 0 else x['A'] + x['B'], axis=1)

我们可以根据需求设置不同的条件逻辑来生成新列。

4. 查找集合的交集与差集

Python 提供了多种内置数据类型,其中之一是 集合(Set)。集合是一种无序且元素唯一的数据结构,常用于数据运算,比如查找公共元素。

例如,假设我们有以下两个集合:

set1 = {"apple", "banana", "cherry", "date", "fig"}
set2 = {"cherry", "date", "elderberry", "fig", "grape"}

我们想要找出两个集合中的公共元素,可以使用:

set1.intersection(set2)

输出结果:

{'cherry', 'date', 'fig'}

在这里插入图片描述

这是一种简单但非常实用的方法。反过来,我们也可以找出只存在于一个集合中的不同元素:

set1.difference(set2)

输出结果:

{'apple', 'banana'}

在这里插入图片描述

当我们需要查找公共元素和差异元素时,可以将这种方法应用到数据处理工作流中。

5. 使用布尔掩码进行数据筛选

在处理 NumPy 数组及其衍生对象时,我们有时需要根据特定需求筛选数据。在这种情况下,可以创建布尔掩码(boolean mask),根据设定的布尔条件过滤数据。

例如,假设我们有以下数据列表:

import numpy as np
data = np.array([10, 15, 20, 25, 30, 35, 40, 45, 50])

如果我们想要筛选出其中的偶数,可以这样写:

data[(data % 2 == 0)]

输出结果:

array([10, 20, 30, 40, 50])

这种方法也是 Pandas 数据筛选的基础。而布尔掩码更为灵活,因为它不仅适用于 Pandas,同样适用于 NumPy 数组。

6. 统计列表元素出现次数

在处理列表或其他包含多个值的数据时,我们有时需要统计每个值的出现频率。这种情况下,可以使用 Counter 函数自动完成计数。

例如,假设我们有以下列表:

data = [10, 10, 20, 20, 30, 35, 40, 40, 40, 50]

我们可以使用 Counter 来计算频率:

from collections import Counter
Counter(data)

输出结果:

Counter({10: 2, 20: 2, 30: 1, 35: 1, 40: 3, 50: 1})

结果是一个字典结构,表示各个元素的出现次数。在需要快速统计频率时,这种方法非常实用。

7. 从文本中提取数字

正则表达式(Regex)是一种基于模式匹配的字符序列,通常用于执行特定的文本处理操作。借助正则表达式,我们可以用一行代码完成从文本中提取数字的任务。

例如:

import re
list(map(int, re.findall(r'\d+', "Sample123Text456")))

输出结果:

[123, 456]

上述示例仅适用于整数提取。但通过深入学习正则表达式,我们可以扩展这一技巧,以适应更复杂的场景。

8. 扁平化嵌套列表

在数据准备过程中,我们有时会遇到嵌套列表(即列表中包含列表)。此时,可能需要将其“扁平化”,以便于进一步的数据分析或可视化。

例如:

nested_list = [
    [1, 2, 3],
    [4, 5],
    [6, 7, 8, 9]
]

可以使用以下方法将其展开为一维列表:

sum(nested_list, [])

输出结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

在这里插入图片描述

得到的一维数据列表更加简洁,有利于后续分析和处理。

9. 列表转字典

有时我们会遇到这样一种情况:手头有多个列表,希望将它们组合成字典格式,以便实现映射或特征编码。

此时,可以借助 zip 函数完成转换。

例如:

fruit = ['apple', 'banana', 'cherry']
values = [100, 200, 300]
dict(zip(fruit, values))

输出结果:

{'apple': 100, 'banana': 200, 'cherry': 300}

在这里插入图片描述

这是一种快速合并多个列表为字典结构的方法,常用于数据预处理环节。

10. 字典合并

在数据预处理中,我们可能需要将多个字典合并为一个整体。

例如,在执行过“列表转字典”的操作后,我们得到以下两个字典:

fruit_mapping = {'apple': 100, 'banana': 200, 'cherry': 300}
furniture_mapping = {'table': 100, 'chair': 200, 'sofa': 300}

此时,可以使用下面的一行代码将它们合并:

{**fruit_mapping, **furniture_mapping}

输出结果:

{'apple': 100,
 'banana': 200,
 'cherry': 300,
 'table': 100,
 'chair': 200,
 'sofa': 300}

在这里插入图片描述

这样两个字典就被合并为一个字典。这种技巧在需要整合多组数据时非常实用。

总结

本文介绍了 10 个能够提升数据科学工作流的 Python 单行代码技巧。它们涵盖了数据清洗、特征工程、数据结构处理等多个环节,能够帮助你在日常分析任务中更高效地完成数据操作。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐