pandas.core.groupby.SeriesGroupBy.apply#

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

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

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

虽然 apply 是一个非常灵活的方法,但它的缺点是使用它可能比使用更具体的方法(如 aggtransform)慢得多。Pandas 提供了广泛的方法,对于它们的特定用途,它们会比使用 apply 快得多,因此请尝试在求助于 apply 之前使用它们。

Parameters:
funccallable

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

include_groupsbool, default True

当为 True 时,将在分组是 DataFrame 列的情况下尝试将 func 应用于分组。如果这会引发 TypeError,则结果将计算为排除分组。当为 False 时,在应用 func 时将排除分组。

在 2.2.0 版本加入.

自 2.2.0 版本弃用: 将 include_groups 设置为 True 已弃用。在 pandas 的未来版本中只允许 False 值。

args, kwargstuple and dict

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

Returns:
Series 或 DataFrame

参见

pipe

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

aggregate

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

transform

逐列将函数应用于 GroupBy 对象。

Series.apply

将函数应用于 Series。

DataFrame.apply

将函数应用于 DataFrame 的每一行或每一列。

Notes

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

修改传入对象的函数可能会导致意外行为或错误,因此不受支持。有关详细信息,请参阅 使用用户定义函数 (UDF) 方法进行变异

Examples

>>> 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。请注意,g1 有两个分组,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

在上面,组不作为索引的一部分。我们可以使用 group_keys=Trueg2 来包含它们:

>>> 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 参数在这里没有影响,因为结果与输入不是同构的(即,a transform )。

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