如何在保持 Dataframe 结构的同时计算 %

How to calculate % while keeping structure of the Dataframe

有人可以请教如何使用 pandas 在保持数据帧结构的同时添加和计算获胜百分比吗?

原始数据框:

Date    Name    Place
21-Mar  John    1
22-Apr  John    2
23-May  John    1
22-Apr  Alex    2
23-May  Alex    2
21-Mar  Jeff    1
22-Apr  Jeff    8
23-May  Jeff    5
22-Apr  Randy   4
23-May  Randy   5
23-Jun  Randy   1
24-Jul  Randy   1

需要数据框:

Date    Name    Place   Winning %
21-Mar  John    1   0.67
22-Apr  John    2   0.67
23-May  John    1   0.67
22-Apr  Alex    2   0.00
23-May  Alex    2   0.00
21-Mar  Jeff    1   0.33
22-Apr  Jeff    8   0.33
23-May  Jeff    3   0.33
22-Apr  Randy   3   0.50
23-May  Randy   2   0.50
23-Jun  Randy   1   0.50
24-Jul  Randy   1   0.50

获胜百分比=(第一名总数)/(游泳运动员参加比赛的次数)

ex: John 参加了 3 次比赛并获得了 2 次第一名。因此,2/3= 0.67

我试过使用交叉表,但是无法保留数据框的原始结构。

比较 Series.eq for == and count mean with GroupBy.transform 的 return Series 的值与原始 DataFrame:

的长度相同
df['Winning %'] = df['Positions'].eq(1).groupby(df['Name']).transform('mean')

#alternative
#df['Winning %'] = (df.assign(new= df['Positions'].eq(1))
#                     .groupby('Name')['new']
#                     .transform('mean'))
print (df)
      Date   Name  Positions  Winning %
0   21-Mar   John          1   0.666667
1   22-Apr   John          2   0.666667
2   23-May   John          1   0.666667
3   22-Apr   Alex          2   0.000000
4   23-May   Alex          2   0.000000
5   21-Mar   Jeff          1   0.333333
6   22-Apr   Jeff          8   0.333333
7   23-May   Jeff          5   0.333333
8   22-Apr  Randy          4   0.500000
9   23-May  Randy          5   0.500000
10  23-Jun  Randy          1   0.500000
11  24-Jul  Randy          1   0.500000

另一种解决方案,使用第一位的 sum() 来划分每个组的 len。

(
    df.set_index('Name')
    .assign(Winning_pct = df.groupby('Name').Place.apply(lambda x: x.eq(1).sum()/len(x)))
    .reset_index()
)