python - 从 python 中的匹配结果列表创建胜率矩阵

标签 python pandas matrix

名为 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/

相关文章:

python - git-flask-python : Is it safe to remove pycache and flask session folders

python - 在项目和应用程序之间配置 Django url

python - 在 Pandas 中转置几列(不是整个数据框)(与 get_dummies 相反)

python - 按条件查找dataframe中行和列的所有索引

C++ 仅使用矩阵按深度排序。可能的?

python - 如何确认一个文件对象是空的? [Python]

python - 基于另一个文件对数据帧值执行操作

python - 根据索引将数据帧除以另一个数据帧

c - opengl矩阵数学乘法

matlab - 如何逐 block 动态 reshape 矩阵?