python_GroupBy高级应用_transform

1. 简介

在Python中,使用GroupBy()函数可以按照指定的列对数据进行分组,提供聚合计算的功能。而transform()函数则是在分组计算的基础上,对每个组执行矢量化操作的一种函数,返回结果与原始数据行数相同。

本文将重点介绍GroupBy高级应用之一的transform()函数。

2. transform()函数的用法

transform()函数通常与GroupBy()函数搭配使用,它会对指定的列进行分组,并在每个组上执行矢量化操作,返回的结果是一个与原始数据对应的同形状的新Series或DataFrame。

具体使用方式为:

df.groupby('column_name').transform(function)

其中,'column_name'是指按照哪一列进行分组,function是要执行的矢量化操作。

3. transform()函数的示例

3.1 分组求平均值

假设我们有下面这些考试成绩数据:

import pandas as pd

data = {'Name':['Tom', 'Tom', 'Jack', 'Alice', 'Alice', 'Jack', 'Tom', 'Alice', 'Jack', 'Tom', 'Alice', 'Jack', 'Tom', 'Alice', 'Jack'],

'Course':['Chinese', 'Math', 'Math', 'Chinese', 'Math', 'Math', 'Chinese', 'English', 'English', 'Chinese', 'English', 'English', 'Chinese', 'English', 'Math'],

'Score':[78, 87, 90, 82, 76, 95, 83, 89, 91, 92, 94, 90, 94, 86, 88]}

df = pd.DataFrame(data)

现在我们想要按照课程名称分组,计算每个学生在该课程的平均分数。这时候就可以使用transform()函数:

df['Mean_Score'] = df.groupby('Course')['Score'].transform('mean')

print(df)

将会得到以下结果:

     Name   Course  Score  Mean_Score

0 Tom Chinese 78 88.0

1 Tom Math 87 86.0

2 Jack Math 90 86.0

3 Alice Chinese 82 88.0

4 Alice Math 76 86.0

5 Jack Math 95 86.0

6 Tom Chinese 83 88.0

7 Alice English 89 90.0

8 Jack English 91 90.0

9 Tom Chinese 92 88.0

10 Alice English 94 90.0

11 Jack English 90 90.0

12 Tom Chinese 94 88.0

13 Alice English 86 90.0

14 Jack Math 88 86.0

可以看到,我们通过transform()函数成功地将每个学生在不同课程上的分数与该课程的平均分绑定在了一起。

3.2 数据标准化

transform()函数还能用于数据标准化,例如将每一列的数据都标准化到同一个范围内。

需要注意的是,这里使用了自定义函数进行数据标准化,即计算每个值与该列平均数之差的比值。并且,为了避免某些列计算后变成了NaN,需要使用fillna()函数将缺失值填充为0。

import numpy as np

def normalize(x):

return (x - np.mean(x)) / np.std(x)

df[['Score']] = df.groupby('Course')[['Score']].transform(normalize).fillna(0)

print(df)

输出结果如下:

     Name   Course     Score  Mean_Score

0 Tom Chinese -0.598851 88.0

1 Tom Math 0.098504 86.0

2 Jack Math 0.630866 86.0

3 Alice Chinese 0.199617 88.0

4 Alice Math -1.097791 86.0

5 Jack Math 1.283630 86.0

6 Tom Chinese -0.531777 88.0

7 Alice English -0.191625 90.0

8 Jack English 0.223462 90.0

9 Tom Chinese 1.098737 88.0

10 Alice English 0.749697 90.0

11 Jack English 0.059891 90.0

12 Tom Chinese 1.369889 88.0

13 Alice English -1.046856 90.0

14 Jack Math -0.095928 86.0

可以看到,经过标准化操作后,每一列的数据都变化到了同一个范围内,方便了后续的计算。

3.3 数据截断

transform()函数还可以用来对数据进行截断,即保留某个范围内的数值而将其他值重置为上限或下限。

在这个示例中,我们将分数小于60的成绩全部设为60,而将得分大于90的成绩全部设为90。

def cut_off(x):

return np.clip(x, 60, 90)

df[['Score']] = df.groupby('Course')[['Score']].transform(cut_off)

print(df)

将会得到以下结果:

     Name   Course  Score  Mean_Score

0 Tom Chinese 78.0 88.0

1 Tom Math 87.0 86.0

2 Jack Math 90.0 86.0

3 Alice Chinese 82.0 88.0

4 Alice Math 60.0 86.0

5 Jack Math 90.0 86.0

6 Tom Chinese 78.0 88.0

7 Alice English 89.0 90.0

8 Jack English 90.0 90.0

9 Tom Chinese 90.0 88.0

10 Alice English 90.0 90.0

11 Jack English 90.0 90.0

12 Tom Chinese 90.0 88.0

13 Alice English 86.0 90.0

14 Jack Math 88.0 86.0

可以看到,成绩小于60的都被截断为了60,而大于90的成绩都被截断为了90,符合我们的预期。

4. 总结

以上就是transform()函数的应用示例了。transform()函数可以在分组计算的基础上,对每个组执行矢量化操作,返回的结果是一个与原始数据行数相同的新Series或DataFrame。我们可以利用它进行平均值计算、数据标准化、数据截断等操作。

上一篇:python_if判断语句

下一篇:Python_random模块

后端开发标签