pandas.core.groupby.SeriesGroupBy.apply#

SeriesGroupBy.apply(func, *args, **kwargs)[源代码][源代码]#

按组应用函数 func 并将结果合并在一起。

传递给 apply 的函数必须以一个序列作为其第一个参数,并返回一个 DataFrame、Series 或标量。apply 然后将负责将结果组合回一个单一的 DataFrame 或 Series。因此,apply 是一个高度灵活的分组方法。

虽然 apply 是一个非常灵活的方法,它的缺点是使用它可能比使用更具体的方法如 aggtransform 慢很多。Pandas 提供了大量方法,这些方法在特定用途上比使用 apply 快得多,所以在使用 apply 之前,尽量尝试使用它们。

参数:
函数callable

一个可调用对象,它以一个序列作为其第一个参数,并返回一个数据框、一个序列或一个标量。此外,该可调用对象还可以接受位置参数和关键字参数。

*argstuple

传递给 func 的可选位置参数。

**kwargsdict

传递给 func 的可选关键字参数。

返回:
Series 或 DataFrame

应用 func 到每个组的结果的 pandas 对象。

参见

pipe

将函数应用于整个 GroupBy 对象,而不是应用于每个组。

aggregate

将聚合函数应用于 GroupBy 对象。

transform

对 GroupBy 对象逐列应用函数。

Series.apply

对一个 Series 应用一个函数。

DataFrame.apply

对DataFrame的每一行或每一列应用一个函数。

备注

在 1.3.0 版本发生变更: 生成的 dtype 将反映传递的 func 的返回值,请参见下面的示例。

修改传递对象的函数可能会产生意外行为或错误,并且不受支持。更多详情请参见 使用用户定义函数 (UDF) 方法进行变异

例子

>>> s = pd.Series([0, 1, 2], index="a a b".split())
>>> g1 = s.groupby(s.index, group_keys=False)
>>> g2 = s.groupby(s.index, group_keys=True)

从上面的 s 我们可以看到 g 有两个组,ab。注意 g1g2 都有两个组,ab,只是在它们的 group_keys 参数上有所不同。以不同的方式调用 apply,我们可以得到不同的分组结果:

示例 1: 传递给 apply 的函数以一个 Series 作为其参数并返回一个 Series。apply 将每个组的结果组合成一个新的 Series。

在 1.3.0 版本发生变更: 生成的 dtype 将反映传递的 func 的返回值。

>>> g1.apply(lambda x: x * 2 if x.name == "a" else x / 2)
a    0.0
a    2.0
b    1.0
dtype: float64

在上文中,组不是索引的一部分。我们可以通过使用 g2 并设置 group_keys=True 来包含它们:

>>> g2.apply(lambda x: x * 2 if x.name == "a" else x / 2)
a  a    0.0
   a    2.0
b  b    1.0
dtype: float64

示例 2:传递给 apply 的函数接受一个 Series 作为其参数并返回一个标量。apply 将每个组的结果组合成一个 Series,包括适当地设置索引:

>>> g1.apply(lambda x: x.max() - x.min())
a    1
b    0
dtype: int64

group_keys 参数在这里没有效果,因为结果与输入相比不是类似索引的(即:一个变换)。

>>> g2.apply(lambda x: x.max() - x.min())
a    1
b    0
dtype: int64