python - 如何计算累积点数?
问题描述
我有以下数据框:
HomeTeam = ["A", "B", "B", "D", "C", "A", "C", "D"]
AwayTeam = ["C", "D", "A", "C", "B", "D", "A", "B"]
Result = ["HT", "AT", "HT", "HT", "D", "AT", "D", "AT"]
Round = [1,1,2,2,3,3,4,4]
dict = {'HomeTeam': HomeTeam, 'AwayTeam': AwayTeam, 'Result': Result, 'Round': Round}
df = pd.DataFrame(dict)
df
结果:
"HT" = 主队获胜 --> 主队 +3,客队 0
"AT" = 客队获胜 --> 主队 0,客队 +3
"D" = 平局 --> 主队 +1,客队 +1
我需要创建两个不同的列:
1)累积积分主队:它包含从主队获得的总积分,直到那场比赛。
2)客队累计积分:包含客队在该场比赛前获得的总积分。
我正在使用Python
,但我的循环不能完美运行。
这是我的预期结果:
解决方案
没有循环的解决方案,完全使用 Pandas 灵活
使用DataFrame.melt
with np.select
(获取点)并将DataFrame.pivot_table
框架返回到原始 sape:
df = df.join(df.reset_index()
.melt(['index','Round','Result'],value_name = 'Team',var_name = 'H/A')
.sort_values('index')
.assign(Points = lambda x:np.select([ x['Result'].eq('D'),
x['H/A'].eq('HomeTeam')
.mul(x['Result'].eq('HT'))|
x['H/A'].eq('AwayTeam')
.mul(x['Result'].eq('AT'))],
[1,3],
default = 0))
.assign(CumPoints = lambda x: x.groupby('Team')
.Points
.cumsum()
.groupby(x['Team'])
.shift(fill_value = 0))
.pivot_table(index = 'index',
columns = 'H/A',
values = 'CumPoints'
fill_value = 0)
.sort_index(axis = 1,ascending = False)
.add_prefix('CumulativePoints')
)
print(df)
输出
HomeTeam AwayTeam Result Round CumulativePointsHomeTeam CumulativePointsAwayTeam
0 A C HT 1 0 0
1 B D AT 1 0 0
2 B A HT 2 0 3
3 D C HT 2 3 0
4 C B D 3 0 3
5 A D AT 3 3 6
6 C A D 4 1 3
7 D B AT 4 9 4
推荐阅读
- service - 启动/停止失败时 systemctl 是否应该显示输出?
- php - 带有模拟的 Symfony 单元测试服务找不到类名
- database - {...} 类型的参数不能分配给 [ ] 类型的参数
- javascript - 读取 Jira 项目中的所有卡片
- android - NavigationView中如何实现CoordinatorLayout和工具栏
- powershell - 如何允许未指定的命名参数?
- mysql - mySQL 中的完全外连接计数
- ios - 将解析列中的值抓取到标签中
- powershell - 带有脚本块的 PowerShell Start-Job 使用参数调用另一个脚本
- python - 如何使用列号而不是名称来有条件地对 Pandas 中的行进行子集化