pandas.core.groupby.SeriesGroupBy.transform#

SeriesGroupBy.transform(func, *args, engine=None, engine_kwargs=None, **kwargs)[源代码]#

对每个组调用产生相同索引的 Series 的函数。

返回一个具有与原始对象相同的索引,并填充了转换后值的 Series。

Parameters:
ffunction, str

要应用于每个组的函数。有关要求,请参见下方的“说明”部分。

可接受的输入包括:

  • String

  • Python function

  • Numba JIT function with engine='numba' specified.

只有在使用此引擎时才支持传递单个函数。如果选择“numba”引擎,则该函数必须是用户定义的函数,其函数签名中,valuesindex 分别作为第一个和第二个参数。每个组的索引都将传递给用户定义的函数,并可供选择使用。

如果选择字符串,则它需要是你想要使用的 groupby 方法的名称。

*args

传递给 func 的位置参数。

enginestr,默认 None
  • 'cython' : 通过 cython 的 C 扩展运行函数。

  • 'numba' : 通过 numba 的 JIT 编译代码运行函数。

  • None : Defaults to 'cython' or the global setting compute.use_numba

engine_kwargsdict, 默认为 None
  • 对于 'cython' 引擎,没有可接受的 engine_kwargs

  • 对于 'numba' 引擎,该引擎可以接受 nopythonnogilparallel 字典键。值必须是 TrueFalse'numba' 引擎的默认 engine_kwargs{'nopython': True, 'nogil': False, 'parallel': False},并将应用于函数

**kwargs

要传递给 func 的关键字参数。

Returns:
Series

参见

Series.groupby.apply

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

Series.groupby.aggregate

沿指定轴使用一个或多个操作进行聚合。

Series.transform

在 self 上调用 func,生成一个与 self 具有相同轴形状的 Series。

Notes

每个组都具有 ‘name’ 属性,以防你需要知道你正在处理哪个组。

当前的实现对 f 施加了三个要求:

  • f 必须返回一个值,该值要么具有与输入子帧相同的形状,要么可以广播到输入子帧的形状。例如,如果 f 返回一个标量,它将被广播到与输入子帧相同的形状。

  • 如果是 DataFrame,f 必须支持逐列应用于子帧。如果 f 还支持应用于整个子帧,则从第二个块开始使用快速路径。

  • f 不能修改组。不支持修改,并且可能产生意外结果。有关详细信息,请参见 使用用户定义函数 (UDF) 方法进行变异

使用 engine='numba' 时,内部不会有“回退”行为。组数据和组索引将作为 numpy 数组传递给 JITed 用户定义的函数,并且不会尝试其他执行。

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

在 2.0.0 版本发生变更: 在对分组的 DataFrame 使用 .transform 时,如果转换函数返回一个 DataFrame,pandas 现在会将结果的索引与输入的索引对齐。你可以调用转换函数的结果上的 .to_numpy() 来避免对齐。

Examples

>>> ser = pd.Series([390.0, 350.0, 30.0, 20.0],
...                 index=["Falcon", "Falcon", "Parrot", "Parrot"],
...                 name="Max Speed")
>>> grouped = ser.groupby([1, 1, 2, 2])
>>> grouped.transform(lambda x: (x - x.mean()) / x.std())
    Falcon    0.707107
    Falcon   -0.707107
    Parrot    0.707107
    Parrot   -0.707107
    Name: Max Speed, dtype: float64

Broadcast result of the transformation

>>> grouped.transform(lambda x: x.max() - x.min())
Falcon    40.0
Falcon    40.0
Parrot    10.0
Parrot    10.0
Name: Max Speed, dtype: float64
>>> grouped.transform("mean")
Falcon    370.0
Falcon    370.0
Parrot     25.0
Parrot     25.0
Name: Max Speed, dtype: float64

在 1.3.0 版本发生变更.

结果的 dtype 将反映所传入 func 的返回值,例如:

>>> grouped.transform(lambda x: x.astype(int).max())
Falcon    390
Falcon    390
Parrot     30
Parrot     30
Name: Max Speed, dtype: int64