根据熊猫df计算各个团队的胜率

时间:2019-09-14 15:25:25

标签: pandas

具有如下所示的熊猫df

HomeTeam    AwayTeam    Winner
Warriors    Cavaliers   1
Pistons     Rockets     0
Warriors    Rockets     1
Heat        Warriors    0

“获胜者”列中的二进制结果代表获胜球队(主队或客队)。我想计算每个团队的总体获胜百分比。我将如何去做呢?

预期的输出将类似于

Team     Win%
Warriors 85%
Heat     22%
....

2 个答案:

答案 0 :(得分:2)

我们可以使用np.choose选择获胜者,并对获胜者和两支球队都进行.value_counts(),从而使用以下公式计算比率:

np.choose(
    df['Winner'], [df['HomeTeam'], df['AwayTeam']]
).value_counts().div(
    df[['HomeTeam', 'AwayTeam']].stack().value_counts()
).fillna(0)

因此,我们在这里使用np.choose选择球队,并进行价值计数,接下来我们.stack() HomeTeamAwayTeam获得一系列的价值。参加比赛的球队。然后,我们可以使用.values_counts()来计算一个团队踢了多少次。如果一支队伍从不出现在获胜方,那将导致NaN。我们可以通过对这些值使用0来解决这个问题。

使用给定的样本数据,我们获得:

>>> np.choose(df['Winner'], [df['HomeTeam'], df['AwayTeam']]).value_counts().div(df[['HomeTeam', 'AwayTeam']].stack().value_counts()).fillna(0)
Cavaliers    1.0
Heat         1.0
Pistons      1.0
Rockets      0.5
Warriors     0.0
dtype: float64

这里CavaliersHeatPistons赢得了所有比赛,Rocket赢得了比赛的一半,而Warrior没有赢得比赛赢得任何一场比赛。

答案 1 :(得分:0)

使用numpy.where来获得获胜者团队,用Series.value_counts来计数值,并用ravelSeries.value_counts用计数值除以两列的所有值,用于除法{ {3}},然后乘以100,最后由Series.divSeries.rename_axisSeries转换为DataFrame

winners = pd.Series(np.where(df['Winner'], df['AwayTeam'], df['HomeTeam'])).value_counts()
all_teams = df[['HomeTeam', 'AwayTeam']].stack().value_counts()

df1 = winners.div(all_teams, fill_value=0).mul(100).rename_axis('Team').reset_index(name='Win%')
print (df1)
       Team   Win%
0  Cavaliers  100.0
1       Heat  100.0
2    Pistons  100.0
3    Rockets   50.0
4   Warriors    0.0

详细信息

print (winners)
Rockets      1
Heat         1
Cavaliers    1
Pistons      1
dtype: int64

print (all_teams)
Warriors     3
Rockets      2
Heat         1
Cavaliers    1
Pistons      1
dtype: int64