当传递一个lambda问题时,Python Pandas Transform在内部是如何工作的?

x6yk4ghg  于 2022-11-20  发布在  Python
关注(0)|答案(1)|浏览(147)

我在网上找到了下面的示例,它解释了如何从本质上实现PARTITIONBY的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

我很难理解lambda函数lambda x中的'x'指的是什么:x/x.sum(),因为当用作分子时,它看起来是指单个元素,即“x”,但当用作分母时,它看起来是值的列表,即x.sum()。
我想我没有思考这是在正确的方式或有差距,在我的理解Python或Pandas。

pgx2nnw8

pgx2nnw81#

当用作分子即“x”时,它看起来是指单个元素,但当用作分母即x时,它也看起来是值的列表。sum()
它不会,它返回一个长度为pd.Series的大小的组,而x / x.sum()不是一个单一的值,它返回一个同样大小的pd.Series
.transform会将此序列的值指派给group-by作业中该数据行的Map值。
因此,请考虑:

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]:

相关问题