在数据帧中的组内使用np.cumsum

2024-04-29 06:03:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近使用了{}和{}来累计计算当前网球比赛中在给定锦标赛中获胜的所有比赛。我使用此代码在第一个表中获得winner\u tourney\u games\u cumulative列:

df.groupby(['tourney_name', 'year', 'winner_name'])['winner_games_played'].cumsum()

一场比赛的网球比赛数据集:

^{tb1}$

这对胜利者来说相对简单,但对失败者来说就不那么简单了。鉴于当前比赛中的失败者通过了锦标赛的第一轮,这意味着他们之前至少赢过一场比赛,因此是前一场比赛的赢家。这使事情变得复杂,因为赢家和输家列在数据中是分开的。因此,我相信我写的带有np.cumsum()的简短代码(如上图所示)对失败者不起作用

有谁能帮助我为失败者创造一些类似于我为胜利者所做的事情(冠军\锦标赛\游戏\累积专栏)?我想要的是失败者在本次锦标赛的前几场比赛中赢得的比赛数的累计总和

对于失败者,我的设想是这样的(你可以忽略下面的x):

^{tb2}$

对于费德勒在他输掉的那场比赛来说,应该是79场(他在过去几场比赛中在第一桌赢得的累计比赛)+22场(他在这场比赛中赢了多少场)=101场

非常感谢


Tags: 数据代码namedf事情games锦标赛tourney
1条回答
网友
1楼 · 发布于 2024-04-29 06:03:59

这需要一些转换。我们首先用df逐行列出每一场比赛的赢家和输家:

df2 = (df.melt(id_vars ='round', value_vars = ['winner_name','loser_name'], var_name = 'win_lose', value_name = 'name')
   .join(
 df.melt(id_vars ='round', value_vars = ['winner_games_played','loser_games_played'], value_name = 'games_won')['games_won'] 
   )
)
df2

我们得到

    round    win_lose     name               games_won
      -       -         -       -
 0  R128     winner_name  Roger Federer             22
 1  R64      winner_name  Roger Federer             21
 2  R32      winner_name  Roger Federer             18
 3  R16      winner_name  Roger Federer             18
 4  QF       winner_name  Grigor Dimitrov           24
 5  R128     loser_name   Sumit Nagal               13
 6  R64      loser_name   Damir Dzumhur             15
 7  R32      loser_name   Daniel Evans               5
 8  R16      loser_name   David Goffin               4
 9  QF       loser_name   Roger Federer             22

现在我们可以按玩家名称计算cumsum

df2['cum_games'] = df2.groupby('name').cumsum()
df2

所以我们得到了

    round    win_lose     name               games_won    cum_games
      -       -         -       -       -
 0  R128     winner_name  Roger Federer             22           22
 1  R64      winner_name  Roger Federer             21           43
 2  R32      winner_name  Roger Federer             18           61
 3  R16      winner_name  Roger Federer             18           79
 4  QF       winner_name  Grigor Dimitrov           24           24
 5  R128     loser_name   Sumit Nagal               13           13
 6  R64      loser_name   Damir Dzumhur             15           15
 7  R32      loser_name   Daniel Evans               5            5
 8  R16      loser_name   David Goffin               4            4
 9  QF       loser_name   Roger Federer             22          101

也许这对你的目的来说已经足够了。但如果不是,我们通过groupbyunstack将其恢复(或多或少)原始形状

df2.groupby(['round','win_lose'], sort = False).first().unstack(level = 1)

得到

            name                          games_won                 cum_games
win_lose    winner_name     loser_name    winner_name   loser_name  winner_name loser_name
round                       
R128        Roger Federer   Sumit Nagal   22            13          22          13
R64         Roger Federer   Damir Dzumhur 21            15          43          15
R32         Roger Federer   Daniel Evans  18             5          61          5
R16         Roger Federer   David Goffin  18             4          79          4
QF          Grigor Dimitrov Roger Federer 24            22          24          101

除了一些不同的列名外,数据是您想要的,即(‘cum_games’、‘losser_name’)列是每轮失败者赢得的累计游戏数

相关问题 更多 >