解析pandas apply() 函数用法(推荐)

1. 什么是 apply() 函数

pandas 库是 Python 中非常重要的数据处理库之一,它提供了大量的数据处理工具,其中非常常用的一个函数就是 apply() 函数。apply() 函数可以用于 DataFrame 和 Series 中,它的作用是将自定义函数应用于 DataFrame 或 Series 的某一个轴上的数据。也就是说,通过 apply() 函数,我们可以将一个自定义函数应用到 DataFrame 或 Series 的每一行或每一列。

2. apply() 函数的参数

apply() 函数有以下三个参数:

func:自定义函数

axis:轴向,0 表示应用于每一列,1 表示应用于每一行,默认为 0。

args:可选参数,是用于传递给 func 函数的额外参数。

3. apply() 函数的用法

下面通过使用 apply() 函数来解决一些实际问题来说明它的用法。

3.1 求一列数据的最大值和最小值

首先,我们可以用 apply() 函数来计算一列数据的最大值和最小值。例如,我们有以下一个包含学生语文、数学、英语成绩的 DataFrame:

import pandas as pd

df = pd.DataFrame({

'name': ['Tom', 'Jerry', 'Alice', 'Bob'],

'chinese': [82, 90, 75, 68],

'math': [89, 79, 88, 92],

'english': [91, 78, 83, 85]

})

print(df)

以上代码输出如下:

    name  chinese  math  english

0 Tom 82 89 91

1 Jerry 90 79 78

2 Alice 75 88 83

3 Bob 68 92 85

现在,我们要计算每科成绩的最大值和最小值。这里我们可以使用 apply() 函数配合 Python 内置函数 max() 和 min() 来实现。

def max_min(col):

return (max(col), min(col))

print(df[['chinese', 'math', 'english']].apply(max_min))

以上代码输出如下:

chinese    (90, 68)

math (92, 79)

english (91, 78)

dtype: object

输出的结果显示了每科成绩的最大值和最小值。其中,每科成绩都被当作一个 Series 对象传递给了 max_min 函数,每个 Series 对象都包含了一列成绩。max_min 函数使用 Python 内置函数 max() 和 min() 来计算每列成绩的最大值和最小值,然后将它们以元组的形式返回给 apply() 函数,最终 apply() 函数将每列的最大值和最小值以 Series 对象的形式返回。

3.2 将字符串转换为小写字母

我们可以用 apply() 函数将 DataFrame 中某一列的字符串全部转换成小写字母。例如:

df = pd.DataFrame({

'name': ['Tom', 'Jerry', 'Alice', 'Bob'],

'gender': ['Male', 'Male', 'Female', 'Male']

})

print(df)

以上代码输出如下:

    name  gender

0 Tom Male

1 Jerry Male

2 Alice Female

3 Bob Male

我们现在要将 gender 列中的字符串全部转换成小写字母。可以像下面这样使用 apply() 函数:

df['gender'] = df['gender'].apply(lambda x: x.lower())

print(df)

以上代码输出如下:

    name  gender

0 Tom male

1 Jerry male

2 Alice female

3 Bob male

这里使用了一个匿名函数来将字符串转换成小写字母,并将其作为参数传递给 apply() 函数。apply() 函数将 gender 列的每个元素都传递给匿名函数,然后将函数的返回值(即转换后的小写字母)作为该元素的新值,最终完成了整列数据的转换。

3.3 按照特定条件进行分组

我们可以用 apply() 函数来按照特定条件对 DataFrame 中的数据进行分组。例如,我们有以下一个包含订单商品信息的 DataFrame:

df = pd.DataFrame({

'buyer': ['Tom', 'Tom', 'Alice', 'Bob', 'Bob'],

'item': ['apple', 'banana', 'pear', 'banana', 'apple'],

'price': ['1.5', '1.0', '2.0', '1.5', '1.2']

})

print(df)

以上代码输出如下:

   buyer    item price

0 Tom apple 1.5

1 Tom banana 1.0

2 Alice pear 2.0

3 Bob banana 1.5

4 Bob apple 1.2

现在我们要按照 buyer 列进行分组,并计算每个买家购买的商品数量和总价值。我们可以像下面这样使用 apply() 函数:

def total_price(group):

return pd.DataFrame({

'count': [len(group)],

'total': [sum(group['price'].astype(float))]

})

print(df.groupby('buyer').apply(total_price))

以上代码输出如下:

          count  total

buyer

Alice 0 1.0 2.0

Bob 0 2.0 2.7

Tom 0 2.0 2.5

apply() 函数会按照 buyer 列进行分组,然后将每个组传递给 total_price 函数。total_price 函数接收到的 group 参数是一个 DataFrame 对象,它由一个买家的所有订单组成。total_price 函数会计算每个买家购买的商品数量和总价值,并将它们存储在一个新的 DataFrame 中返回。最终 apply() 函数将所有分组的计算结果合并成一个 DataFrame。

3.4 替换数据

我们可以用 apply() 函数将 DataFrame 中的某些数据替换成其他数据。例如,我们有以下一个包含 0 和 1 的 DataFrame:

df = pd.DataFrame({

'a': [0, 1, 0, 1],

'b': [1, 0, 1, 0]

})

print(df)

以上代码输出如下:

   a  b

0 0 1

1 1 0

2 0 1

3 1 0

现在我们要把所有的 0 替换成 -1。可以像下面这样使用 apply() 函数:

def replace_zero(x):

if x == 0:

return -1

else:

return x

df = df.applymap(replace_zero)

print(df)

以上代码输出如下:

   a  b

0 -1 1

1 1 -1

2 -1 1

3 1 -1

这里使用了 applymap() 函数来将 replace_zero 函数应用于每个元素。applymap() 函数用法类似于 apply() 函数,不同之处在于 applymap() 函数可以用于 DataFrame 中的每个元素,而 apply() 函数只能用于 DataFrame 中的每一列或每一行。

4. 总结

apply() 函数是 pandas 库中非常重要的一个函数,可以用于对 DataFrame 或 Series 中的数据进行自定义处理。通过使用 apply() 函数,我们可以方便地完成一些数据处理任务,例如计算每列的最大值和最小值、转换字符串、进行分组计算和替换数据等。需要注意的是,在使用 apply() 函数时应该尽量避免使用循环,这样可以避免降低程序的执行效率。

后端开发标签