pandas.core.groupby.DataFrameGroupBy.apply#
- DataFrameGroupBy.apply(func, *args, include_groups=True, **kwargs)[源代码]#
按组应用函数
func
并将结果合并在一起。传递给
apply
的函数必须以一个 DataFrame 作为其第一个参数,并返回一个 DataFrame、Series 或标量。apply
然后将负责将结果组合回一个单独的 DataFrame 或 Series。因此,apply
是一个高度灵活的分组方法。虽然
apply
是一个非常灵活的方法,但它的缺点是使用它可能比使用更具体的方法如agg
或transform
慢很多。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 对象。
参见
备注
在 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
在上文中,组不是索引的一部分。我们可以通过使用
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