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() 函数时应该尽量避免使用循环,这样可以避免降低程序的执行效率。