pandas.core.groupby.DataFrameGroupBy.transform #

DataFrameGroupBy。变换func * args engine = None engine_kwargs = None ** kwargs[来源] #

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

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

参数
f函数、str

适用于每个组的函数。有关要求,请参阅下面的注释部分。

接受的输入是:

  • 细绳

  • Python函数

  • Numba 指定了 JIT 函数engine='numba'

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

如果选择一个字符串,那么它必须是您要使用的 groupby 方法的名称。

*参数

传递给 func 的位置参数。

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

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

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

engine_kwargs字典,默认 None
  • 对于'cython'发动机,没有可接受的engine_kwargs

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

**夸格

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

返回
数据框

也可以看看

DataFrame.groupby.apply

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

DataFrame.groupby.aggregate

使用指定轴上的一项或多项操作进行聚合。

DataFrame.transform

调用funcself 生成一个与 self 具有相同轴形状的 DataFrame。

笔记

每个组都被赋予属性“名称”,以防您需要知道您正在哪个组工作。

当前的实现对 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