如何使用Pandas groupby方法计算不同分组对战的平均胜率交叉表
Pandas 实现两组对战胜率交叉表
完整实现代码
import pandas as pd # 初始化原始数据集 z = pd.DataFrame({'match': [1,1,2,2,3,3,4,4], 'group': [0,1,1,2,0,2,1,2], 'win': [0,1,1,0,0,1,0,1]}) # 按比赛分组得到每场对阵的两个组和对应胜负 match_pairs = z.groupby('match').agg( group1=('group', 'first'), win1=('win', 'first'), group2=('group', 'last'), win2=('win', 'last') ).reset_index(drop=True) # 拼接双向对阵记录,支持两个方向的胜率统计 pair_records = pd.concat([ match_pairs.rename(columns={'group1':'row_group', 'group2':'col_group', 'win1':'win_rate'}), match_pairs.rename(columns={'group2':'row_group', 'group1':'col_group', 'win2':'win_rate'}) ]) # 生成交叉表,计算平均胜率,自身对阵填充为'-' result = pair_records.pivot_table( index='row_group', columns='col_group', values='win_rate', aggfunc='mean' ).fillna('-') print(result)
输出结果
运行上述代码后得到的结果和需求完全一致:
col_group 0 1 2 row_group 0 - 0.0 0.0 1 1.0 - 0.5 2 1.0 0.5 -
逻辑说明
- 第一步通过
groupby+agg把每场比赛的两条记录合并为单条对阵记录,避免后续匹配冗余 - 第二步生成双向对阵记录,满足行、列两个维度的胜率统计需求
- 第三步通过透视表聚合计算平均胜率,空值(自身对阵)替换为
-即可
内容的提问来源于stack exchange,提问作者stevemo
相关产品推荐
相关产品推荐

