Python之分组级运算——【transform()方法、apply()方法】

文章目录

  • 数据转换——transform()方法
  • 数据应用——apply()方法


数据转换——transform()方法

使用aggregate()方法进行聚合运算已经在上一篇博客中详细阐述,我们知道aggregate()方法返回的数据集的形状(shape)与被分组的数据集的形状是不同的,如果希望保持与原数据数据集形状相同,则可以通过transfrom()方法实现。

transform(self, func, *args, **kwargs)

上述方法中只有一个func参数,表示操作Pandas对象的函数,该函数可以是内置方法也可以是自定义函数。

transform()方法返回的结果有两种:

  • 一种是可以广播的标量值(np.mean)
  • 一种可以是与分组大小相同的结果数组

通过transfrom()方法操作分组时,该方法回将func()函数应用到各个分组中,并且将结果放在适当的位置上。

下面通过实例来进一步了解该方法的具体功能。


创建测试对象:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(25).reshape(5, 5),
                  index=list([0, 1, 2, 3, 4]),
                  columns=list('abcde'))
df['key'] = pd.Series(data=list('AABBB'), name='key')
print(df)

输出结果:

    a   b   c   d   e key
0   0   1   2   3   4   A
1   5   6   7   8   9   A
2  10  11  12  13  14   B
3  15  16  17  18  19   B
4  20  21  22  23  24   B

以key列进行分组,可以将df对象拆分成A、B两组,将mean()方法应用到每个分组中,计算每个分组中每列的平均值。

代码如下:

df_group = df.groupby('key').transform('mean')
print(df_group)

输出结果:

      a     b     c     d     e
0   2.5   3.5   4.5   5.5   6.5
1   2.5   3.5   4.5   5.5   6.5
2  15.0  16.0  17.0  18.0  19.0
3  15.0  16.0  17.0  18.0  19.0
4  15.0  16.0  17.0  18.0  19.0

从输出结果可以看出,每列的数据是各分组求得的平均数。操作过程是通过mean()方法算出均值(一个标准量)后将其广播。


不难发现上述示例中,原始数据的列数与最终结果的列数是不一样的。

如果希望原始数据的列数与最终结果的列数是一样的。那么需要创建一个Series对象作为分组键,而不是将原始数据中的列作为分组键。

创建测试对象:

df1 = DataFrame(np.arange(20).reshape(5, 4))
print(df1)

输出结果:

    0   1   2   3
0   0   1   2   3
1   4   5   6   7
2   8   9  10  11
3  12  13  14  15
4  16  17  18  19

然后创建一个列表key,key的长度需要与df1对象的行数是一样的,我们将key当作分组键,然后对每个分组执行求平均值的操作。

代码如下:

key = ['one', 'one', 'two', 'two', 'two']
df1_group = df1.groupby(by=key).transform('mean')
print(df1_group)

输出结果:

    0   1   2   3
0   2   3   4   5
1   2   3   4   5
2  12  13  14  15
3  12  13  14  15
4  12  13  14  15

数据应用——apply()方法

apply()方法的使用十分灵活,它可以作用于DataFrame中的每一列、每一行元素,还可以在许多标准用例中代替聚合和转换。

测试对象:

    a   b   c   d   e key
0   0   1   2   3   4   A
1   5   6   7   8   9   A
2  10  11  12  13  14   B
3  15  16  17  18  19   B
4  20  21  22  23  24   B

运用apply()方法的代码如下:

df_by_group = df.groupby('key')


def plus_ten(data_frame):
    return data_frame.iloc[:, :5] + 10


df_by_group_apply = df_by_group.apply(func=plus_ten)
print(df_by_group_apply)

输出结果:

    a   b   c   d   e
0  10  11  12  13  14
1  15  16  17  18  19
2  20  21  22  23  24
3  25  26  27  28  29
4  30  31  32  33  34

也可以用内置方法进行数据应用:

df1_by_group_apply1 = df.iloc[:, :5].apply(func='mean')
print("df1_apply:\n", df1_by_group_apply1)

输出结果:

df1_apply:
 a    10.0
b    11.0
c    12.0
d    13.0
e    14.0
dtype: float64

你可能感兴趣的:(Python,python,数据分析,numpy,pandas,索引)