pandas.core.groupby.DataFrameGroupBy.transform#

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

在每个组上调用生成相同索引的DataFrame的函数。

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

参数:
func函数, 字符串

应用于每个组的函数。请参阅下面的“备注”部分以了解要求。

接受的输入是:

  • 字符串

  • Python 函数

  • 指定 engine='numba' 的 Numba JIT 函数。

此引擎仅支持传递单个函数。如果选择了 'numba' 引擎,该函数必须是用户定义的函数,并且在函数签名中 valuesindex 分别作为第一个和第二个参数。每个组的索引将被传递给用户定义的函数,并可选择用于使用。

如果选择了一个字符串,那么它需要是你想要使用的 groupby 方法的名称。

*args

传递给 func 的位置参数。

引擎str, 默认为 None
  • 'cython' : 通过cython的C扩展运行函数。

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

  • None : 默认为 'cython' 或全局设置 compute.use_numba

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

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

**kwargs

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

返回:
DataFrame

与原始对象具有相同索引的 DataFrame,填充了转换后的值。

参见

DataFrame.groupby.apply

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

DataFrame.groupby.aggregate

使用一个或多个操作进行聚合。

DataFrame.transform

在自身上调用 func 生成一个与自身轴形状相同的 DataFrame。

备注

每个组都被赋予了 ‘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() 以避免对齐。

示例

>>> df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
...                           'foo', 'bar'],
...                    'B' : ['one', 'one', 'two', 'three',
...                           'two', 'two'],
...                    'C' : [1, 5, 5, 2, 5, 5],
...                    'D' : [2.0, 5., 8., 1., 2., 9.]})
>>> grouped = df.groupby('A')[['C', 'D']]
>>> grouped.transform(lambda x: (x - x.mean()) / x.std())
        C         D
0 -1.154701 -0.577350
1  0.577350  0.000000
2  0.577350  1.154701
3 -1.154701 -1.000000
4  0.577350 -0.577350
5  0.577350  1.000000

广播转换的结果

>>> grouped.transform(lambda x: x.max() - x.min())
    C    D
0  4.0  6.0
1  3.0  8.0
2  4.0  6.0
3  3.0  8.0
4  4.0  6.0
5  3.0  8.0
>>> grouped.transform("mean")
    C    D
0  3.666667  4.0
1  4.000000  5.0
2  3.666667  4.0
3  4.000000  5.0
4  3.666667  4.0
5  4.000000  5.0

在 1.3.0 版本发生变更.

生成的 dtype 将反映传递的 func 的返回值,例如:

>>> grouped.transform(lambda x: x.astype(int).max())
C  D
0  5  8
1  5  9
2  5  8
3  5  9
4  5  8
5  5  9