本文目录导读:

- 项目背景:为什么统计红黄牌?
- 数据准备:从CSV到Pandas DataFrame
- 核心逻辑:分组聚合与条件计数
- 可视化对比:谁才是“吃牌大户”?
- 延伸思考:红黄牌数据背后的战术信号
- 常见问题FAQ(含代码优化技巧)
**
Python实战案例:用数据科学统计红黄牌数量,哪支球队更“暴力”?——基于Pandas与Matplotlib的足球赛事分析
目录导读
- 项目背景:为什么统计红黄牌?
- 数据准备:从CSV到Pandas DataFrame
- 核心逻辑:分组聚合与条件计数
- 可视化对比:谁才是“吃牌大户”?
- 延伸思考:红黄牌数据背后的战术信号
- 常见问题FAQ(含代码优化技巧)
项目背景:为什么统计红黄牌?
在足球赛事分析中,红黄牌不仅代表纪律处罚,更隐含球队的防守强度、比赛节奏甚至战术倾向,高位逼抢型球队往往犯规更多,而控球型球队则更少,通过Python自动统计各队红黄牌总数,可以快速定位“激进型”球队,为教练组或体育媒体提供数据支撑。本文以2023-2024赛季欧洲五大联赛部分比赛数据为例,演示如何用Python实现红黄牌统计并对比“哪队更多”。
数据准备:从CSV到Pandas DataFrame
假设你有一份比赛数据集(cards_data.csv),包含字段:match_id、team_home、team_away、yellow_home、yellow_away、red_home、red_away,我们将使用pandas读取数据:
import pandas as pd
df = pd.read_csv('cards_data.csv')
print(df.head())
关键点:数据需清洗,确保红黄牌列无缺失值(用fillna(0)处理),若数据源是比赛事件表(每行一张牌),则需用groupby()聚合。
核心逻辑:分组聚合与条件计数
假设数据是比赛级聚合(每行一场比赛),统计每队总红黄牌需分别计算主客场,再合并:
# 主队红黄牌
home_cards = df.groupby('team_home')[['yellow_home', 'red_home']].sum().reset_index()
home_cards.columns = ['team', 'yellow', 'red']
# 客队红黄牌
away_cards = df.groupby('team_away')[['yellow_away', 'red_away']].sum().reset_index()
away_cards.columns = ['team', 'yellow', 'red']
# 合并并求和
total_cards = pd.concat([home_cards, away_cards]).groupby('team')[['yellow', 'red']].sum()
total_cards['total'] = total_cards['yellow'] + total_cards['red'] * 2 # 红牌计2分权重
print(total_cards.sort_values('total', ascending=False).head(10))
逻辑优化:红牌权重通常>黄牌(红牌=2张黄牌),故可设置red_weight=2,便于对比“严重性”,若数据为事件明细表(每行包含team、card_type),则直接用pivot_table:
pivot = pd.pivot_table(event_df, index='team', columns='card_type', values='match_id', aggfunc='count', fill_value=0)
可视化对比:谁才是“吃牌大户”?
用matplotlib绘制横向柱状图,直观显示前10名:
import matplotlib.pyplot as plt
top_teams = total_cards.nlargest(10, 'total')[['total']]
plt.figure(figsize=(10, 6))
plt.barh(top_teams.index, top_teams['total'], color='orange')
plt.xlabel('Total Cards (Red*2 + Yellow)')'Top 10 Teams by Card Counts in 2023-24 Season')
plt.gca().invert_yaxis()
plt.show()
见解:结果可能显示中下游球队或保级队更“脏”,因为强队控球率高、犯规少,但需注意红牌多也可能意味着防守策略较鲁莽。
延伸思考:红黄牌数据背后的战术信号
- 相关性分析:计算红黄牌与“场均犯规”的相关性,判断是否冗余指标。
- 时间维度:统计全场伤停补时阶段的红黄牌占比,洞察比赛最后时刻的紧张度。
- 主客场差异:用
groupby(['team', 'venue'])对比主场与客场吃牌数,验证“主场哨”是否存在。
常见问题FAQ(含代码优化技巧)
Q1:如果数据有上百万行,代码会卡吗?
A:用dask或polars替代pandas,或提前用category数据类型压缩内存,上述groupby在百万行内秒级完成,无需过度担忧。
Q2:怎么把结果导出为Excel报表?
total_cards.to_excel('cards_summary.xlsx', sheet_name='Total')
Q3:红黄牌权重怎么自定义?
A:只需修改total = yellow + red * weight中的weight变量,若按欧足联规则(红牌=3分),调整即可。
Q4:如何用爬虫自动获取最新数据?
A:可用requests+BeautifulSoup从FBref或WhoScored抓取,但需遵守robots协议,或直接使用football-data.org的免费API(需注册key)。
Q5:统计学中有更严谨的指标吗?
A:可计算“每90分钟吃牌率”,用总牌数除以总出场时间,消除比赛场次差异,例如df['rate'] = total / (match_count * 90)。
通过Python的pandas和matplotlib,我们轻松完成了红黄牌统计与可视化,快速定位“激进”球队,但请记住,数据只是表象,结合比赛录像和战术图才能洞察本质。别忘了尝试修改权重、添加过滤条件(如只统计英超),让分析更贴合你的需求,下次看球时,你可以“偷偷”用这段代码预判哪队会吃牌了!