pandas.core.groupby.SeriesGroupBy.apply#
- SeriesGroupBy.apply(func, *args, **kwargs)[源代码][源代码]#
按组应用函数
func
并将结果合并在一起。传递给
apply
的函数必须以一个序列作为其第一个参数,并返回一个 DataFrame、Series 或标量。apply
然后将负责将结果组合回一个单一的 DataFrame 或 Series。因此,apply
是一个高度灵活的分组方法。虽然
apply
是一个非常灵活的方法,它的缺点是使用它可能比使用更具体的方法如agg
或transform
慢很多。Pandas 提供了大量方法,这些方法在特定用途上比使用apply
快得多,所以在使用apply
之前,尽量尝试使用它们。- 参数:
- 函数callable
一个可调用对象,它以一个序列作为其第一个参数,并返回一个数据框、一个序列或一个标量。此外,该可调用对象还可以接受位置参数和关键字参数。
- *argstuple
传递给
func
的可选位置参数。- **kwargsdict
传递给
func
的可选关键字参数。
- 返回:
- Series 或 DataFrame
应用
func
到每个组的结果的 pandas 对象。
参见
备注
在 1.3.0 版本发生变更: 生成的 dtype 将反映传递的
func
的返回值,请参见下面的示例。修改传递对象的函数可能会产生意外行为或错误,并且不受支持。更多详情请参见 使用用户定义函数 (UDF) 方法进行变异。
例子
>>> s = pd.Series([0, 1, 2], index="a a b".split()) >>> g1 = s.groupby(s.index, group_keys=False) >>> g2 = s.groupby(s.index, group_keys=True)
从上面的
s
我们可以看到g
有两个组,a
和b
。注意g1
和g2
都有两个组,a
和b
,只是在它们的group_keys
参数上有所不同。以不同的方式调用 apply,我们可以得到不同的分组结果:示例 1: 传递给 apply 的函数以一个 Series 作为其参数并返回一个 Series。apply 将每个组的结果组合成一个新的 Series。
在 1.3.0 版本发生变更: 生成的 dtype 将反映传递的
func
的返回值。>>> g1.apply(lambda x: x * 2 if x.name == "a" else x / 2) a 0.0 a 2.0 b 1.0 dtype: float64
在上文中,组不是索引的一部分。我们可以通过使用
g2
并设置group_keys=True
来包含它们:>>> g2.apply(lambda x: x * 2 if x.name == "a" else x / 2) a a 0.0 a 2.0 b b 1.0 dtype: float64
示例 2:传递给 apply 的函数接受一个 Series 作为其参数并返回一个标量。apply 将每个组的结果组合成一个 Series,包括适当地设置索引:
>>> g1.apply(lambda x: x.max() - x.min()) a 1 b 0 dtype: int64
group_keys
参数在这里没有效果,因为结果与输入相比不是类似索引的(即:一个变换)。>>> g2.apply(lambda x: x.max() - x.min()) a 1 b 0 dtype: int64