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之前使用它们。- 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
参见
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)
请注意,
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
在上面,组不作为索引的一部分。我们可以使用
group_keys=True的g2来包含它们:>>> 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