10 个能提升你数据科学工作流的 Python 单行代码
【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。
文章目录

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 单行代码技巧。它们涵盖了数据清洗、特征工程、数据结构处理等多个环节,能够帮助你在日常分析任务中更高效地完成数据操作。
更多推荐



所有评论(0)