繁体   English   中英

如何在保持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

获胜%=(第1名的总数)/(游泳参加比赛的次数)

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

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

通过Series.eq比较==值,并使用GroupBy.transform计算mean ,返回与原始DataFrame相同长度的Series

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()
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM