具有如下所示的熊猫df
HomeTeam AwayTeam Winner
Warriors Cavaliers 1
Pistons Rockets 0
Warriors Rockets 1
Heat Warriors 0
“获胜者”列中的二进制结果代表获胜球队(主队或客队)。我想计算每个团队的总体获胜百分比。我将如何去做呢?
预期的输出将类似于
Team Win%
Warriors 85%
Heat 22%
....
答案 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()
HomeTeam
和AwayTeam
获得一系列的价值。参加比赛的球队。然后,我们可以使用.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
这里Cavaliers
,Heat
和Pistons
赢得了所有比赛,Rocket
赢得了比赛的一半,而Warrior
没有赢得比赛赢得任何一场比赛。
答案 1 :(得分:0)
使用numpy.where
来获得获胜者团队,用Series.value_counts
来计数值,并用ravel
和Series.value_counts
用计数值除以两列的所有值,用于除法{ {3}},然后乘以100
,最后由Series.div
用Series.rename_axis
将Series
转换为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