如何在Pandas中使用groupby()和transform()函数

491 阅读2分钟

你可以使用以下方法在pandas DataFrame中一起使用groupby()transform()函数。

方法1:使用groupby()和transform()的内置函数

df['new'] = df.groupby('group_var')['value_var'].transform('mean')

方法2:用自定义函数使用groupby()和transform()

df['new'] = df.groupby('group_var')['value_var'].transform(lambda x: some function)

下面的例子展示了如何在实践中使用每一种方法,包括以下pandas DataFrame。

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'points': [30, 22, 19, 14, 14, 11, 20, 28]})

#view DataFrame
print(df)

  team  points
0    A      30
1    A      22
2    A      19
3    A      14
4    B      14
5    B      11
6    B      20
7    B      28

例子1:使用groupby()和transform()的内置函数

下面的代码显示了如何使用groupby()和**trasnform()**函数为DataFrame添加一个新的列,名为mean_points。

#create new column called mean_points
df['mean_points'] = df.groupby('team')['points'].transform('mean')

#view updated DataFrame
print(df)

  team  points  mean_points
0    A      30        21.25
1    A      22        21.25
2    A      19        21.25
3    A      14        21.25
4    B      14        18.25
5    B      11        18.25
6    B      20        18.25
7    B      28        18.25

A队球员的平均分值是21.25,B队球员的平均分值是18.25,所以这些值被相应地分配给新列中的每个球员。

请注意,我们也可以使用另一个内置函数,如**sum()**来创建一个新的列,显示每队的得分之和。

#create new column called sum_points
df['sum_points'] = df.groupby('team')['points'].transform('sum')

#view updated DataFrame
print(df)

  team  points  sum_points
0    A      30          85
1    A      22          85
2    A      19          85
3    A      14          85
4    B      14          73
5    B      11          73
6    B      20          73
7    B      28          73

A队球员的得分之和为85 分,B队球员的得分之和为73分,所以这些数值被相应地分配给新列中的每个球员。

例2:使用groupby()和transform()的自定义函数

下面的代码显示了如何使用groupby()和**transform()**函数来创建一个自定义函数,计算每个球员在各自球队的总得分的百分比。

#create new column called percent_of_points
df['percent_of_points'] = df.groupby('team')['points'].transform(lambda x: x/x.sum())

#view updated DataFrame
print(df)

  team  points  percent_of_points
0    A      30           0.352941
1    A      22           0.258824
2    A      19           0.223529
3    A      14           0.164706
4    B      14           0.191781
5    B      11           0.150685
6    B      20           0.273973
7    B      28           0.383562

下面是如何解释输出结果的:

  • A队的第一名球员在A队球员的85个总分中得到了30分。因此,他占总得分的百分比为30/85=0.352941
  • A队的第二个球员在A队球员的85个总分中得到22分。因此,他占总分的百分比为22/85=0.258824

以此类推:

请注意,我们可以在transform()函数中使用lambda参数来执行任何我们想要的自定义计算。

其他资源

下面的教程解释了如何在pandas中执行其他常见操作:

如何在Pandas中执行GroupBy总和
如何在Pandas中使用Groupby和绘图
如何在Pandas中使用GroupBy计算唯一值