名为 A、B、C、D、E 的角色互相进行了大量的游戏,我记录了他们的最终结果。角色也可以与自己对战。我的数据框看起来像这样:
df = pd.DataFrame(data = [['A', 'B'], ['D', 'D'], ['E', 'A'], ['C', 'D'], ['E', 'D']],
columns = ['Winner', 'Loser'])
我想构建一个胜率矩阵,其中我的列是 A、B、C、D、E,我的行索引也是 A、B、C、D、E,每个单元格都是胜率索引与列的比较。对角线在数学上是 50%。
我没有正确的想法将数据框转换为这个矩阵,希望得到一些帮助。另请注意,我无法开始将 df 汇总为 groupby('Winner') 作为 {['A', 'B'], ['A', 'B'], ['B', ' A']} 也应该归为 A 的 66% 胜率,总共打了 3 场比赛。
最佳答案
注意:我想出了另一种(可以说更简单)的方法来获取请求的输出。将其作为新答案发布在这里,因为我认为该方法与我的 other answer
有很大不同。 .比照。 SO etiquette
关于这件事。
这是一种依赖于 df.pivot
的方法和 df.groupby
生成请求的矩阵。
import pandas as pd
import numpy as np
data = {'Winner': {0: 'A', 1: 'D', 2: 'E', 3: 'C', 4: 'A', 5: 'B'},
'Loser': {0: 'B', 1: 'D', 2: 'A', 3: 'D', 4: 'B', 5: 'A'}}
df = pd.DataFrame(data)
# set up a list for our index and columns
abc = list('ABCDE')
# apply `df.pivot`
# drop level 0 from multiindex cols: e.g. keep only 'A' in `('Winner', 'A')`
# reindex cols based on list `abc`, and turn values into bools with `notna()`
bools = df.pivot(index=None, columns=['Loser'], values=['Winner'])\
.droplevel(0, axis=1).reindex(abc, axis=1).notna()
# use map to overwrite idx with values in `df['Winner']` and sort
bools.index = bools.index.map(df['Winner'])
# groupby index and get sum (i.e. count of all `True` vals)
summed_on_idx = bools.groupby(bools.index).sum()
# now also reindex based on list `abc` for index
summed_on_idx = summed_on_idx.reindex(abc).fillna(0)
# divide result by (sum result by its transposed version)
matrix = summed_on_idx/summed_on_idx.add(summed_on_idx.T)
# get rid of columns `name` ('Loser')
matrix.columns.name = None
print(matrix)
A B C D E
A NaN 0.666667 NaN NaN 0.0
B 0.333333 NaN NaN NaN NaN
C NaN NaN NaN 1.0 NaN
D NaN NaN 0.0 0.5 NaN
E 1.000000 NaN NaN NaN NaN
关于python - 从 python 中的匹配结果列表创建胜率矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73568113/