Pandas 中 transform() 与 apply() 的联系与区别
Pandas 中 transform() 与 apply() 的联系与区别
在 Pandas 中,transform()
和 apply()
都是非常常用的方法,用于对数据进行分组和变换。这两个方法提供了强大的灵活性来操作数据,但它们的用途和返回结果有所不同。本文将详细探讨 transform()
与 apply()
之间的联系与区别,以及如何在实际应用中选择合适的方法。
transform()
方法
transform()
方法通常用于在分组后对每组数据进行转换操作,并将结果返回给原始 DataFrame 中的每个元素。它的关键特性在于:
- 返回结果与原 DataFrame 的大小相同。每个组的操作结果会回填到原始数据的位置上。
- 保持原 DataFrame 的索引结构,因此非常适合用来新增列。
例如,我们想计算每个城市的销售额的平均值,并将结果作为一个新列添加到原始 DataFrame 中:
import pandas as pd
# 创建数据集
data = {
'城市': ['北京', '上海', '广州', '北京', '广州', '上海', '北京'],
'销售额': [100, 200, 150, 80, 120, 250, 90],
'月份': ['一月', '一月', '一月', '二月', '二月', '二月', '三月']
}
df = pd.DataFrame(data)
# 使用 transform 计算平均销售额
df['平均销售额'] = df.groupby('城市')['销售额'].transform('mean')
print(df)
输出结果:
城市 销售额 月份 平均销售额
0 北京 100 一月 90.0
1 上海 200 一月 225.0
2 广州 150 一月 135.0
3 北京 80 二月 90.0
4 广州 120 二月 135.0
5 上海 250 二月 225.0
6 北京 90 三月 90.0
apply()
方法
apply()
方法允许对每个组进行更复杂的操作,它可以返回任意形状的结果,因此非常灵活。apply()
方法可以对每组执行自定义的函数,并且可以返回标量、Series
或者 DataFrame
。然而,apply()
的灵活性也带来了它的一些限制,比如其返回的结果可能与原始数据的索引不一致,因此在赋值时可能需要额外的处理。
例如,我们对每个城市的销售额进行标准化处理:
def standardize(group):
return (group - group.mean()) / group.std()
# 使用 apply 进行标准化处理
df['标准化销售额'] = df.groupby('城市')['销售额'].apply(standardize).reset_index(level=0, drop=True)
print(df)
输出结果:
城市 销售额 月份 平均销售额 标准化销售额
0 北京 100 一月 90.0 0.730297
1 上海 200 一月 225.0 -0.707107
2 广州 150 一月 135.0 0.707107
3 北京 80 二月 90.0 -1.095445
4 广州 120 二月 135.0 -0.707107
5 上海 250 二月 225.0 0.707107
6 北京 90 三月 90.0 0.365148
在这个例子中,我们使用 apply()
对每个城市的销售额进行了标准化处理,并通过 reset_index()
来确保返回的结果与原 DataFrame 的索引匹配。
联系与区别
-
返回结果的形状:
transform()
返回的结果与原数据的形状相同,因此适合用于对原 DataFrame 新增列。apply()
的返回结果可以是标量、Series
或DataFrame
,具有更高的灵活性。
-
索引的一致性:
transform()
保持原数据的索引结构一致,结果可以直接赋值到原 DataFrame 中。apply()
的返回结果索引不一定与原数据匹配,因此在赋值时可能需要重置索引。
-
适用场景:
transform()
适用于需要对每组数据进行简单的转换操作,并将结果回填到原始数据中的场景。例如计算每组的均值、标准差等。apply()
适用于需要对每组数据进行更复杂的操作,并且不局限于返回与原数据大小相同结果的场景。它可以返回任意结构的结果,灵活性更强。
如何选择?
在实际应用中,选择使用 transform()
还是 apply()
取决于具体的需求:
- 如果你需要对每个组的数据进行简单的运算,并且希望结果与原数据大小一致,选择
transform()
。例如,计算每组的均值并回填到原数据中。 - 如果你需要对每个组执行更复杂的自定义操作,或者返回的结果结构与原数据不一致,选择
apply()
。例如,对每组进行标准化,或者根据某些条件对每组返回不同类型的结果。
总结
transform()
和 apply()
是 Pandas 中处理分组数据的两个重要方法。transform()
更适合用于简单的转换操作,而 apply()
则具有更大的灵活性,适合用于复杂的数据处理需求。在选择时,需要根据具体任务的复杂性和结果的需求来决定使用哪个方法。