本文目录导读:

下面给你一个 Python 统计头球争顶成功率 的完整案例,包含:
- 数据模拟(模拟球员争顶数据)
- 统计逻辑(成功 / 总争顶)
- 输出结果(按球员、按球队)
- 可视化(可选)
数据模拟
假设你有如下数据(通常来自比赛事件流):
# 每条记录:球员, 球队, 是否成功(1=成功, 0=失败)
data = [
("哈兰德", "曼城", 1),
("哈兰德", "曼城", 1),
("哈兰德", "曼城", 0),
("哈兰德", "曼城", 1),
("哈兰德", "曼城", 0),
("姆巴佩", "皇马", 1),
("姆巴佩", "皇马", 0),
("姆巴佩", "皇马", 0),
("姆巴佩", "皇马", 1),
("凯恩", "拜仁", 1),
("凯恩", "拜仁", 1),
("凯恩", "拜仁", 0),
("凯恩", "拜仁", 1),
("凯恩", "拜仁", 1),
("凯恩", "拜仁", 0),
("C罗", "利雅得胜利", 1),
("C罗", "利雅得胜利", 0),
("C罗", "利雅得胜利", 1),
("C罗", "利雅得胜利", 1),
]
使用 Pandas 统计
import pandas as pd
df = pd.DataFrame(data, columns=["球员", "球队", "成功"])
# 按球员统计
player_stats = df.groupby("球员").agg(
总争顶=("成功", "count"),
成功次数=("成功", "sum")
).reset_index()
player_stats["成功率(%)"] = (player_stats["成功次数"] / player_stats["总争顶"] * 100).round(2)
print("按球员统计:")
print(player_stats.sort_values("成功率(%)", ascending=False))
输出示例:
球员 总争顶 成功次数 成功率(%)
0 C罗 4 3 75.0
1 哈兰德 5 3 60.0
2 凯恩 6 4 66.67
3 姆巴佩 4 2 50.0
按球队汇总
team_stats = df.groupby("球队").agg(
总争顶=("成功", "count"),
成功次数=("成功", "sum")
).reset_index()
team_stats["成功率(%)"] = (team_stats["成功次数"] / team_stats["总争顶"] * 100).round(2)
print("\n按球队统计:")
print(team_stats)
只用纯 Python(不用 Pandas)
from collections import defaultdict
player_data = defaultdict(lambda: [0, 0]) # [成功, 总]
for name, team, success in data:
player_data[name][0] += success
player_data[name][1] += 1
print("球员头球争顶成功率:")
print(f"{'球员':<10}{'成功':<6}{'总争顶':<8}{'成功率%':<10}")
for name, (succ, total) in sorted(player_data.items(), key=lambda x: x[1][0]/x[1][1] if x[1][1] else 0, reverse=True):
rate = succ / total * 100 if total else 0
print(f"{name:<10}{succ:<6}{total:<8}{rate:<10.2f}")
可视化(Matplotlib 柱状图)
import matplotlib.pyplot as plt
# 使用上面的 player_stats
plt.figure(figsize=(8, 5))
plt.bar(player_stats["球员"], player_stats["成功率(%)"], color="skyblue")
plt.ylabel("成功率 (%)")"球员头球争顶成功率")
plt.ylim(0, 100)
for i, v in enumerate(player_stats["成功率(%)"]):
plt.text(i, v + 1, str(v), ha="center")
plt.show()
实际场景扩展
如果数据来自 CSV 文件:
df = pd.read_csv("head_duel_data.csv")
# 假设列名为: player, team, success (0/1)
如果数据有比赛 ID,可以按比赛筛选:
df[df["match_id"] == 2024001]
总结关键点
| 统计项 | 方法 |
|---|---|
| 总争顶次数 | count() |
| 成功次数 | sum() |
| 成功率 | 成功 / 总 × 100 |
| 按球员分组 | groupby("球员") |
| 按球队汇总 | groupby("球队") |
| 可视化 | matplotlib 柱状图 |
如果你有实际数据(CSV/Excel/JSON),可以把文件结构发我,我帮你写出完整读取 + 统计 + 导出的脚本。