基于Pandas的DataFrame列按条件求和及英超球队赛季黄牌红牌统计方法问询
解决英超球队黄牌/红牌统计问题的简洁方法
嘿,我明白你的困扰——分开统计主客场的数据再相加确实麻烦,还容易出问题。咱们来用更优雅的方式搞定这个需求,顺便解答你关于“基于另一列值对两列求和”的疑问。
一、统计全赛季球队总黄牌/红牌数
你的核心问题是要把球队作为主、客队时的黄牌(红牌)数合并统计,之前的方法会因为索引不匹配或代码冗余出问题。我们可以把主客场的数据规整到同一结构后再合并计算:
1. 统计黄牌总数
import pandas as pd # 提取主队黄牌数据并重命名列 home_yellow = df[["HomeTeam", "HY"]].rename(columns={"HomeTeam": "Team", "HY": "YellowCards"}) # 提取客队黄牌数据并重命名列 away_yellow = df[["AwayTeam", "AY"]].rename(columns={"AwayTeam": "Team", "AY": "YellowCards"}) # 合并主客队数据,统一统计 all_yellow = pd.concat([home_yellow, away_yellow], ignore_index=True) # 按球队分组求和,降序排序 yellow_top_teams = all_yellow.groupby("Team")["YellowCards"].sum().sort_values(ascending=False)
2. 统计红牌总数
红牌的统计逻辑完全一致,假设红牌列是HR(主队红牌)和AR(客队红牌):
home_red = df[["HomeTeam", "HR"]].rename(columns={"HomeTeam": "Team", "HR": "RedCards"}) away_red = df[["AwayTeam", "AR"]].rename(columns={"AwayTeam": "Team", "AR": "RedCards"}) all_red = pd.concat([home_red, away_red], ignore_index=True) red_top_teams = all_red.groupby("Team")["RedCards"].sum().sort_values(ascending=False)
这种方法的优势:
- 避免了两个
groupby结果相加时的索引不匹配问题 - 代码更简洁易读,方便后续扩展(比如统计其他数据)
二、基于另一列的值对两列求和
你提到的“基于另一列的值对两列求和”,其实可以理解为根据某个条件,动态选择要相加的列。举个常见的场景:
场景1:每行中根据条件选择列赋值
比如,给每行添加一列,显示当前指定球队(比如主队)的单场黄牌数:
import numpy as np # 假设我们要提取每行主队的黄牌数,也可以根据其他条件调整逻辑 df["CurrentTeamYellow"] = np.where(df["Role"] == "Home", df["HY"], df["AY"])
场景2:按分组条件合并两列数据
其实我们前面统计总黄牌数的方法就是这类需求的延伸:把主客场的球队和对应数据映射到同一列,本质就是基于“主客场”这个隐含条件,把HY和AY的值合并到YellowCards列中,再按球队分组求和——这也是处理这类“分角色统计”问题的通用思路。
内容的提问来源于stack exchange,提问作者Mick G
相关产品推荐
相关产品推荐

