谁是最忙的门将?
下面给你一个可直接运行的 Python 脚本,用模拟数据演示如何统计并比较各位门将的扑救次数("忙碌程度"),你可以把 data 换成真实的比赛数据。

完整脚本
import pandas as pd
from collections import defaultdict
# ============ 1. 模拟数据(替换为真实数据) ============
# 每行代表一次对方射正球门的事件
# goalkeeper: 门将名, saved: 是否扑救成功(1=扑出, 0=丢球)
data = [
{"goalkeeper": "Alisson", "saved": 1},
{"goalkeeper": "Alisson", "saved": 1},
{"goalkeeper": "Alisson", "saved": 0},
{"goalkeeper": "Alisson", "saved": 1},
{"goalkeeper": "Ederson", "saved": 1},
{"goalkeeper": "Ederson", "saved": 0},
{"goalkeeper": "Ederson", "saved": 0},
{"goalkeeper": "Courtois", "saved": 1},
{"goalkeeper": "Courtois", "saved": 1},
{"goalkeeper": "Courtois", "saved": 1},
{"goalkeeper": "Courtois", "saved": 1},
{"goalkeeper": "Courtois", "saved": 1},
{"goalkeeper": "Neuer", "saved": 1},
{"goalkeeper": "Neuer", "saved": 0},
{"goalkeeper": "Neuer", "saved": 1},
]
df = pd.DataFrame(data)
# ============ 2. 统计每位门将 ============
# 面对射正次数 = 忙碌程度的核心指标
stats = df.groupby("goalkeeper").agg(
shots_faced=("saved", "count"), # 面对射正次数(越忙越大)
saves=("saved", "sum"), # 成功扑救次数
).reset_index()
# 计算扑救成功率
stats["save_rate"] = (stats["saves"] / stats["shots_faced"] * 100).round(1)
# 按"忙碌程度"(面对射正次数)排序
stats = stats.sort_values("shots_faced", ascending=False).reset_index(drop=True)
# ============ 3. 输出结果 ============
print("=" * 55)
print(f"{'门将':<12}{'面对射正':>10}{'扑救':>8}{'扑救率%':>10}")
print("=" * 55)
for _, row in stats.iterrows():
print(f"{row['goalkeeper']:<12}{row['shots_faced']:>10}{row['saves']:>8}{row['save_rate']:>10}")
# 最忙的门将
busiest = stats.iloc[0]
print("=" * 55)
print(f"🔥 最忙的门将:{busiest['goalkeeper']}(面对 {busiest['shots_faced']} 次射正)")
# 扑救最多的门将
best = stats.loc[stats["saves"].idxmax()]
print(f"🧤 扑救最多:{best['goalkeeper']}({best['saves']} 次扑救)")
# 效率最高(面对≥3次射正的门将中)
qualified = stats[stats["shots_faced"] >= 3]
if not qualified.empty:
eff = qualified.loc[qualified["save_rate"].idxmax()]
print(f"🎯 扑救效率最高:{eff['goalkeeper']}(成功率 {eff['save_rate']}%)")
print("=" * 55)
运行结果示例
=======================================================
门将 面对射正 扑救 扑救率%
=======================================================
Courtois 5 5 100.0
Alisson 4 3 75.0
Neuer 3 2 66.7
Ederson 3 1 33.3
=======================================================
🔥 最忙的门将:Courtois(面对 5 次射正)
🧤 扑救最多:Courtois(5 次扑救)
🎯 扑救效率最高:Courtois(成功率 100.0%)
=======================================================
关键指标说明
| 指标 | 含义 | 说明"忙"的程度 |
|---|---|---|
| 面对射正次数 (shots_faced) | 门将被射正的总次数 | ✅ 最能反映"忙碌程度" |
| 扑救次数 (saves) | 成功扑出的次数 | 忙且表现好 |
| 扑救成功率 (save_rate) | saves / shots_faced | 衡量效率 |
💡 "谁更忙"最直接的答案是看
shots_faced(面对射正次数),而不是扑救次数——因为扑救多可能只是因为对方射正多,真正的"忙"= 防线给他制造了多少工作。
扩展建议
- 按比赛/半场拆分:加
match_id列做分组,看单场最忙的门将。 - 区分射门类型:加
shot_type列(远射/禁区内/点球),加权计算"忙碌指数"。 - 真实数据源:可从 FBref、Understat 或 StatsBomb 开放数据导入,替换脚本中的
data即可。
需要我帮你改成从 CSV 读取或对接某个数据 API 的版本吗?