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 之前,尽量尝试使用它们。

参数:
函数callable

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

*argstuple

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

include_groups布尔值, 默认为 True

当为 True 时,将尝试对 DataFrame 中的分组应用 func。如果这引发 TypeError,结果将使用排除分组的方式计算。当为 False 时,在应用 func 时将排除分组。

Added in version 2.2.0.

自 2.2.0 版本弃用.

将 include_groups 设置为 True 已被弃用。在未来版本的 pandas 中,只允许使用 False 值。

**kwargsdict

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

返回:
Series 或 DataFrame

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

参见

pipe

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

aggregate

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

transform

对 GroupBy 对象逐列应用函数。

Series.apply

对一个 Series 应用一个函数。

DataFrame.apply

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

备注

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

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

例子

>>> 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

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

>>> 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 参数在这里没有效果,因为结果与输入相比不是类似索引的(即:一个变换)。

示例 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

示例 4:传递给 apply 的函数对其中一个组返回 None。该组从结果中被过滤掉:

>>> g1.apply(lambda x: None if x.iloc[0, 0] == 3 else x, include_groups=False)
   B  C
0  1  4
1  2  6