首页 > 解决方案 > 在熊猫中随时间更新获胜率

问题描述

所以我有一个看起来像这样的表格,我想在每场比赛后计算获胜率。所以对于玩家 1,赢率将从他赢得第一场比赛开始为 100%,然后从他输掉第二场比赛开始为 50%,然后是 33%,然后再次回到 50%。

PlayerId     Status
1               1    
1               0        
1               0    
1               1

所以决赛桌看起来像这样

PlayerId     Status     Win_Rate
1               1          100%
1               0          50%
1               0          33%
1               1          50%

标签: pythonpandas

解决方案


您可以.groupby使用 PlayerId 并使用expanding().mean()

In [12]: df.groupby("PlayerId").expanding().mean()
Out[12]:
            PlayerId    Status
PlayerId
1        0       1.0  1.000000
         1       1.0  0.500000
         2       1.0  0.333333
         3       1.0  0.500000
2        4       2.0  1.000000
         5       2.0  0.500000
         6       2.0  0.333333
         7       2.0  0.500000

然后,您可以删除索引级别并将其分配为列,如果您希望它在原始框架上:

In [18]: df['Win_Rate'] = df.groupby("PlayerId").expanding().mean()['Status'].droplevel(0)

In [19]: df
Out[19]:
   PlayerId  Status  Win_Rate
0         1       1  1.000000
1         1       0  0.500000
2         1       0  0.333333
3         1       1  0.500000
4         2       1  1.000000
5         2       0  0.500000
6         2       0  0.333333
7         2       1  0.500000

如果你想要它作为一个字符串百分比,你可以做额外的格式化:

In [25]: df['Win_Rate'] = df['Win_Rate'].mul(100).apply(lambda x: '{}%'.format(int(x)))

In [26]: df
Out[26]:
   PlayerId  Status Win_Rate
0         1       1     100%
1         1       0      50%
2         1       0      33%
3         1       1      50%
4         2       1     100%
5         2       0      50%
6         2       0      33%
7         2       1      50%

推荐阅读