专栏名称: 新语数据故事汇
《新语数据故事汇,数说新语》科普数据科学、讲述数据故事,深层次挖掘数据价值。
目录
相关文章推荐
51好读  ›  专栏  ›  新语数据故事汇

数据科学家必须掌握的12个Python功能

新语数据故事汇  · 公众号  ·  · 2024-08-04 11:40

正文

Python 已经成为数据科学家的必选语言,从数据处理到机器学习,它几乎无所不能。本文将探讨一些Python特性,这些特性不仅能帮助你编写更高效、更易读、更易维护的代码,还特别适合数据科学的需求,使你的代码简洁且优雅。

一:推导式(Comprehensions)

Python中的推导式是机器学习和数据科学任务中的一个有用工具,因为它们可以用简洁且易读的方式创建复杂的数据结构。

列表推导式可以用来生成数据列表,例如,从一系列数字中创建平方值列表。嵌套列表推导式可以用来展平多维数组,这是数据科学中常见的预处理任务。

_list = [x**2 for x in range(1, 11)]
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]flat_list = [num for row in matrix for num in row]
print(_list)print(flat_list)

字典和集合推导式分别用于创建数据的字典和集合。例如,字典推导式可以用来创建一个包含特征名称及其在机器学习模型中的重要性得分的字典。生成器推导式在处理大数据集时特别有用,因为它们是即时生成值,而不是在内存中创建一个大型数据结构。这有助于提高性能并减少内存使用。

_dict = {var:var ** 2 for var in range(1, 11) if var % 2 != 0}
_set = {x**2 for x in range(1, 11)}
_gen = (x**2 for x in range(1, 11))
print(_dict)print(_set)print(list(g for g in _gen))

二:枚举(enumerate)

enumerate 是一个内置函数,可以在迭代序列(如列表或元组)的同时跟踪每个元素的索引。这在处理数据集时非常有用,因为它可以轻松访问和操作各个元素,同时跟踪它们的索引位置。

下面的例子中,我们使用 enumerate 来迭代一个字符串列表,并在索引为偶数时打印出相应的值。

for idx, value in enumerate(["a", "b", "c", "d"]):    if idx % 2 == 0:        print(value)

三:拉链(zip)

zip 是一个内置函数,允许并行迭代多个序列(如列表或元组)。

在下面的例子中,我们使用 zip 同时迭代两个列表 x 和 y,并对它们的对应元素执行操作。在这种情况下,它打印出 x 和 y 中每个元素的值、它们的和以及它们的积。

x = [1, 2, 3, 4]y = [5, 6, 7, 8]
for a, b in zip(x, y): print(a, b, a + b, a * b)

四:生成器(Generators)

Python中的生成器是一种可迭代对象,允许即时生成一系列值,而不是一次性生成所有值并将其存储在内存中。这使得它们在处理无法全部装入内存的大数据集时特别有用,因为数据是以小块或批次的方式处理的,而不是一次性全部处理。

下面我们使用一个生成器函数来生成前 n 个斐波那契数列。yield 关键字用于一次生成序列中的一个值,而不是一次性生成整个序列。

def fib_gen(n):    a, b = 0, 1    for _ in range(n):        yield a        a, b = b, a + b

res = fib_gen(10)print(list(r for r in res))

五:匿名函数(lambda 函数)

lambda 是一个关键字,用于创建匿名函数,即没有名称的函数,可以在一行代码中定义。它们在特征工程、数据预处理或模型评估时非常有用,因为可以即时定义自定义函数。

下面我们使用 lambda 创建一个简单的函数,用于从数字列表中筛选出偶数。

numbers = range(10)
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)

以下是一个使用 lambda 函数与 Pandas 的代码示例:

import pandas as pd
data = { "sales_person": ["Alice", "Bob", "Charlie", "David"], "sale_amount": [100, 200, 300, 400],}df = pd.DataFrame(data)
threshold = 250df["above_threshold"] = df["sale_amount"].apply( lambda x: True if x >= threshold else False)df

六:映射(map)、筛选(filter)、归约(reduce)

map filter reduce 是三个内置函数,用于处理和转换数据。

  • map 用于将函数应用于可迭代对象的每个元素。

  • filter 用于根据条件从可迭代对象中选择元素。

  • reduce 用于将函数应用于可迭代对象中的一对一对元素,最终生成一个单一的结果。

下面我们在一个管道中使用这三个函数,计算偶数的平方和:

numbers = [1, 2, 3, 4, 5, 6]
# 使用 map 计算每个元素的平方squared = map(lambda x: x ** 2, numbers)
# 使用 filter 选择偶数evens = filter(lambda x: x % 2 == 0, squared)
# 使用 reduce 计算偶数平方的和sum_of_squares = reduce(lambda x, y: x + y, evens)
print("Sum of the squares of even numbers:",sum_of_squares)

七:any、all

any all 是内置函数,用于检查可迭代对象中的任意或所有元素是否满足某个条件。

  • any 用于检查可迭代对象中是否存在至少一个元素满足条件。

  • all 用于检查可迭代对象中的所有元素是否都满足条件。

这两个函数在检查数据集中某些条件是否被满足时非常有用。例如,它们可以用来检查某一列中是否存在缺失值,或者某一列中的所有值是否都在某个范围内。

在这个示例中, any 函数检查列表中是否存在任何偶数值,而 all 函数检查列表中的所有值是否都是奇数。

data






请到「今天看啥」查看全文