pandas.core.groupby.DataFrameGroupBy.apply #

DataFrameGroupBy。apply ( func , * args , include_groups = True , ** kwargs ) [来源] #

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

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

虽然是一种非常灵活的方法,但其缺点是使用它可能比使用更具体的方法(如或 )apply慢很多。 Pandas 提供了多种方法,这些方法比用于特定目的的方法要快得多,因此在使用它们之前请尝试使用它们。aggtransformapplyapply

参数:
可调用函数

一个可调用函数,将数据帧作为其第一个参数,并返回数据帧、序列或标量。此外,可调用对象还可以采用位置参数和关键字参数。

include_groups bool, 默认 True

当为 True 时,将尝试应用于func分组(如果它们是 DataFrame 的列)。如果这引发类型错误,则将在排除分组的情况下计算结果。当为 False 时,应用时将排除分组func。

2.2.0 版本中的新增内容。

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

args、kwargs元组和 dict

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

返回:
系列或数据框

也可以看看

pipe

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

aggregate

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

transform

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

Series.apply

将函数应用于系列。

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)

请注意,g1和g2有两个组,a和b, 和 仅在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

在上面,组不是索引的一部分。我们可以通过使用g2where将它们包括在内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 将每个组的结果组合在一起形成一个系列,包括适当设置索引:

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