大熊猫在不同组间的累计计数



我有以下DataFrame:

df = pd.DataFrame({'A': ['Nadal', 'Federer', 'Djokovic', 'Nadal', 'Nadal', 'Murray', 'Nadal'], 
'B': ['Djokovic', 'Nadal', 'Murray', 'Murray', 'Djokovic', 'Federer', 'Murray'],
'Winner': ['Nadal', 'Federer', 'Djokovic', 'Murray', 'Nadal', 'Federer', 'Murray'],
'Loser': ['Djokovic', 'Nadal', 'Murray', 'Nadal', 'Djokovic', 'Murray', 'Nadal']})

我想根据这些结果创建新的功能。例如,当前在A列的玩家在这一行之前赢得和输掉游戏的次数。

结果是这样的:

A         B    Winner     Loser  count_of_wins_A  count_of_wins_B
0     Nadal  Djokovic     Nadal  Djokovic                0                0
1   Federer     Nadal   Federer     Nadal                0                1
2  Djokovic    Murray  Djokovic    Murray                0                0
3     Nadal    Murray    Murray     Nadal                1                0
4     Nadal  Djokovic     Nadal  Djokovic                1                1
5    Murray   Federer   Federer    Murray                1                1
6     Nadal    Murray    Murray     Nadal                2                1

在第6行,我们可以将结果读为选手A:纳达尔在本次比赛之前赢了3场比赛,选手B:穆雷在本次比赛之前赢了1场比赛。

我想通过这第一步来计算其他特征,如:
  • 每个玩家目前的胜率,
  • 每个玩家在最近N场比赛中的胜率;等。

我尝试了很多事情,但从来没有做对。我知道我可以通过在字典中记录每个玩家的输赢次数并遍历所有行来轻松做到这一点,但这并不是很有效。当我想要根据比赛和玩家计算更复杂的胜率时,这个解决方案将变得难以维持。

我可以在胜利者列中获得当前玩家的累积胜利数:

df['Winner_wins'] = df_atp.groupby('Winner').cumcount()但是我不知道如何有效地访问A列中当前玩家之前出现在Winner or Loser列中的次数。

我知道我可以像这样得到一个特定列的假人:

counts = pd.get_dummies(df['Winner']).cumsum()

要计算玩家A在当前行之前出现在Winner列中的次数,我认为我有两个选择:

  • 按当前玩家在a列中进行分组,然后累计计算该组在获胜者列中出现的次数。

  • 根据A列
  • 中的当前名称在右侧索引处检索counts中相应的对应假人

但我真的很难把所有的拼图拼凑在一起。更不用说当我想要按球员和球场类型分组我的数据…

谁有解决方案?

使用get_dummies+shift+cumsum和索引查找:

import numpy as np
tmp = pd.get_dummies(df['Winner']).shift(fill_value=0).cumsum()
idxA, colsA = pd.factorize(df['A'])
df['count_of_wins_A'] = tmp.reindex(colsA, axis=1).to_numpy()[np.arange(len(df)), idxA]
idxB, colsB = pd.factorize(df['B'])
df['count_of_wins_B'] = tmp.reindex(colsB, axis=1).to_numpy()[np.arange(len(df)), idxB]

使用辅助函数:

import numpy as np
tmp = pd.get_dummies(df['Winner']).shift(fill_value=0).cumsum()
def lookup(s, tmp):
idx, cols = pd.factorize(s)
return tmp.reindex(cols, axis=1).to_numpy()[np.arange(len(s)), idx]
df['count_of_wins_A'] = lookup(df['A'], tmp)
df['count_of_wins_B'] = lookup(df['B'], tmp)

输出:

A         B    Winner     Loser  count_of_wins_A  count_of_wins_B
0     Nadal  Djokovic     Nadal  Djokovic                0                0
1   Federer     Nadal   Federer     Nadal                0                1
2  Djokovic    Murray  Djokovic    Murray                0                0
3     Nadal    Murray    Murray     Nadal                1                0
4     Nadal  Djokovic     Nadal  Djokovic                1                1
5    Murray   Federer   Federer    Murray                1                1
6     Nadal    Murray    Murray     Nadal                2                1

相关内容

  • 没有找到相关文章

最新更新