如何在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
相关产品推荐
相关产品推荐

