我有一个数据框,我想看看被杀人数更多的球队获胜的几率(0 =失败; 1 =胜利)。
matchid team win wardskilled
0 10 1 0.0 8.0
1 10 2 1.0 10.0
2 11 1 0.0 8.0
3 11 2 1.0 8.0
4 12 1 0.0 2.0
5 12 2 1.0 5.0
6 13 1 0.0 5.0
7 13 2 1.0 5.0
8 14 1 0.0 1.0
9 14 2 1.0 1.0
10 15 1 1.0 3.0
11 15 2 0.0 1.0
.. .. .. .. ..
.. .. .. .. ..
.. .. .. .. ..
因为我是python的新手,所以我绝对不知道如何开始
我想创建类似这样的东西
Teams with more wardskilled Teams with less wardskilled
win % %
lose % %
我将不胜感激
答案 0 :(得分:2)
另一种方法是将一个团队的wardskilled
与两个团队的平均值进行比较:
means = df.groupby('matchid') .wardskilled.transform('mean')
df['more_skilled'] = np.sign(df.wardskilled.sub(means))
(df.groupby('win')
.more_skilled
.value_counts(normalize=True)
.unstack('more_skilled', fill_value=0)
)
输出
more_skilled -1.0 0.0 1.0
win
0.0 0.5 0.5 0.0
1.0 0.0 0.5 0.5
答案 1 :(得分:1)
rank
如果所有'matchid'
都有2个团队,则可以使用它来确定该团队是较高,较低还是并列的'wardskilled'
。以此分组并计算平均胜利。
s = df.groupby('matchid').wardskilled.rank().map({1: 'Less', 1.5: 'Tied', 2: 'More'})
df.groupby(s).win.mean()
#wardskilled
#More 1.0
#Less 0.0
#Tied 0.5
#Name: win, dtype: float64
拥有两列是多余的,但是如果您必须这样做:
res = df.groupby(s).win.mean().to_frame('win_per')
res['loss_per'] = 1-res['win_per']
# win_per loss_per
#wardskilled
#More 1.0 0.0
#Less 0.0 1.0
#Tied 0.5 0.5