pandas.core.groupby.DataFrameGroupBy.apply#

DataFrameGroupBy.apply(func, *args, include_groups=True, **kwargs)[源代码]#

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

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

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

Parameters:
funccallable

一个可调用对象,它将 DataFrame 作为其第一个参数,并返回一个 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

>>> df = pd.DataFrame({'A': 'a a b'.split(),
...                    'B': [1, 2, 3],
...                    'C': [4, 6, 5]})
>>> g1 = df.groupby('A', group_keys=False)
>>> g2 = df.groupby('A', group_keys=True)

请注意,g1g2 有两个组,ab,它们仅在 group_keys 参数上有所不同。通过各种方式调用 apply,我们可以获得不同的分组结果:

示例 1:下面传递给 apply 的函数接受一个 DataFrame 作为参数并返回一个 DataFrame。apply 将每个组的结果组合成一个新的 DataFrame:

>>> g1[['B', 'C']].apply(lambda x: x / x.sum())
          B    C
0  0.333333  0.4
1  0.666667  0.6
2  1.000000  1.0

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

>>> g2[['B', 'C']].apply(lambda x: x / x.sum())
            B    C
A
a 0  0.333333  0.4
  1  0.666667  0.6
b 2  1.000000  1.0

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

在 1.3.0 版本发生变更: 结果的 dtype 将反映所传入 func 的返回值。

>>> g1[['B', 'C']].apply(lambda x: x.astype(float).max() - x.min())
     B    C
A
a  1.0  2.0
b  0.0  0.0
>>> g2[['B', 'C']].apply(lambda x: x.astype(float).max() - x.min())
     B    C
A
a  1.0  2.0
b  0.0  0.0

group_keys 参数在这里没有影响,因为结果与输入不是同构的(即,a transform )。

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

>>> g1.apply(lambda x: x.C.max() - x.B.min(), include_groups=False)
A
a    5
b    2
dtype: int64