我在网上找到了下面的例子,它解释了如何从本质上实现与PARTITION BY
相当的SQL。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
我很难理解'x'在lambda函数lambda x: x/x.m sum()中指的是什么,因为当用作分子时,它似乎指的是单个元素,即。'x',但当用作分母时,也似乎是一个值列表,即x.p sum()。
我想我的思考方式不对,或者我对蟒蛇或熊猫的理解有差距。
当它被用作分子即。'x',但在使用时也似乎是一个值列表作为分母,即x.sum()
它没有,它返回一个长度与组的大小相同的pd.Series
,并且x / x.sum()
不是一个单一值,它是一个相同大小的pd.Series
。
.transform
将此系列的值分配给group-by操作中该列中的相应值。
所以,考虑:
In [15]: df
Out[15]:
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
In [16]: for k, g in df.groupby('team')['points']:
...: print(g)
...: print(g / g.sum())
...:
0 30
1 22
2 19
3 14
Name: points, dtype: int64
0 0.352941
1 0.258824
2 0.223529
3 0.164706
Name: points, dtype: float64
4 14
5 11
6 20
7 28
Name: points, dtype: int64
4 0.191781
5 0.150685
6 0.273973
7 0.383562
Name: points, dtype: float64
In [17]: