你可以使用以下方法在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计算唯一值