python - 在熊猫中随时间更新获胜率
问题描述
所以我有一个看起来像这样的表格,我想在每场比赛后计算获胜率。所以对于玩家 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%
解决方案
您可以.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%
推荐阅读
- javascript - Vuetify 数据表不显示数据
- php - 我的逻辑有什么问题?尝试制作一个简单的mysqli脚本
- java - 以这种方式使用 Spring 规范谓词是否安全?
- python - 将自定义函数应用于熊猫数据框中的每个列组合
- tabulator - 在 Tabulator 表的每个嵌套数据树下添加总和
- c# - 如何在 C# 中按升序对多维数组进行排序?
- inspector - 如何在钴中使用检查器?
- python-3.x - python函数在尝试将日期时间字符串'12/20/2018 11:02:34:933'转换为日期时间对象时抛出错误
- angular - Angular 7 和 IIS 7:切换到开发环境时出错
- python - 捕获主目录中所有子文件夹中的所有 csv 文件 - Python 3.x