You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中为分组统计结果添加胜负占比列?

如何用Pandas计算球队分主客场的胜负占比

问题说明

我有一个记录球队比赛结果的DataFrame,包含team(球队)、home_or_away(主客场)、result(胜负)三列:

import pandas as pd
df = pd.DataFrame({
    'team': ['X', 'X', 'X', 'X', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z'],
    'home_or_away':['H', 'A', 'A', 'A', 'H', 'H', 'H', 'A', 'H', 'H'],
    'result':['W', 'W', 'W', 'L', 'W', 'L', 'W', 'L', 'L', 'L']
})

已经通过分组统计得到了各球队主客场的胜负次数:

groupedDf = df.groupby(['team', 'home_or_away','result'])[['result']].count()

输出如下:

result
team home_or_away result        
X    A            L            1
                  W            2
     H            W            1
Y    H            L            1
                  W            1
Z    A            L            1
     H            L            2
                  W            1

现在需要添加一列Perc,显示该结果在对应球队主客场总比赛中的占比(保留两位小数),得到目标格式的结果。

实现方案

方法一:分组统计总数后计算占比

先统计每个(球队+主客场)组合的总比赛数,再用胜负次数除以总数得到占比:

import pandas as pd

df = pd.DataFrame({
    'team': ['X', 'X', 'X', 'X', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z'],
    'home_or_away':['H', 'A', 'A', 'A', 'H', 'H', 'H', 'A', 'H', 'H'],
    'result':['W', 'W', 'W', 'L', 'W', 'L', 'W', 'L', 'L', 'L']
})

# 先得到分组后的胜负计数
groupedDf = df.groupby(['team', 'home_or_away','result'])[['result']].count()

# 按(球队+主客场)分组计算总比赛数,再计算占比并格式化
groupedDf['Perc'] = (groupedDf['result'] / groupedDf.groupby(level=['team', 'home_or_away'])['result'].transform('sum')) * 100
groupedDf['Perc'] = groupedDf['Perc'].round(2)

print(groupedDf)

方法二:用value_counts一次性获取计数和占比

利用value_counts的normalize参数直接计算占比,再合并结果:

import pandas as pd

df = pd.DataFrame({
    'team': ['X', 'X', 'X', 'X', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z'],
    'home_or_away':['H', 'A', 'A', 'A', 'H', 'H', 'H', 'A', 'H', 'H'],
    'result':['W', 'W', 'W', 'L', 'W', 'L', 'W', 'L', 'L', 'L']
})

# 按(球队+主客场)分组,分别获取胜负计数和占比
grouped = df.groupby(['team', 'home_or_away'])['result']
counts = grouped.value_counts().rename('result')
percs = grouped.value_counts(normalize=True).mul(100).rename('Perc').round(2)

# 合并两列得到最终结果
groupedDf = pd.concat([counts, percs], axis=1)

print(groupedDf)

两种方法都能生成目标格式的结果,输出示例如下:

result   Perc
team home_or_away result        
X    A            L            1   33.33
                  W            2   66.67
     H            W            1  100.00
Y    H            L            1   50.00
                  W            1   50.00
Z    A            L            1  100.00
     H            L            2   66.67
                  W            1   33.33

内容的提问来源于stack exchange,提问作者korppu73

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:15:29