Python案例:统计反击次数,哪队更高效?
下面我用一个完整的Python案例来演示如何统计足球比赛中的反击次数,并对比两队谁的反击更高效。

问题定义
我们要分析一场比赛中两队的反击数据:
- 统计每队的反击次数
- 统计每次反击的结果(进球 / 射门 / 失误)
- 计算反击效率 = 进球数 / 反击次数
数据准备
import pandas as pd
# 模拟一场比赛的进攻事件数据
data = [
# 球队, 进攻类型, 反击结果, 用时(秒)
("A队", "反击", "进球", 8),
("A队", "反击", "射门被扑", 10),
("A队", "反击", "失误", 6),
("A队", "反击", "进球", 9),
("A队", "反击", "射门偏出", 12),
("A队", "阵地战", "进球", 25),
("B队", "反击", "进球", 7),
("B队", "反击", "进球", 11),
("B队", "反击", "射门被扑", 9),
("B队", "反击", "失误", 5),
("B队", "反击", "进球", 10),
("B队", "反击", "射门偏出", 8),
("B队", "阵地战", "射门偏出", 22),
]
df = pd.DataFrame(data, columns=["球队", "进攻类型", "结果", "用时"])
print(df)
统计反击次数与效率
# 只筛选反击事件
counter = df[df["进攻类型"] == "反击"]
# 统计每队反击次数
counts = counter.groupby("球队").size().rename("反击次数")
# 统计每队反击进球数
goals = counter[counter["结果"] == "进球"].groupby("球队").size().rename("反击进球")
# 合并
result = pd.concat([counts, goals], axis=1).fillna(0)
result["反击成功率"] = (result["反击进球"] / result["反击次数"] * 100).round(1)
# 平均反击用时
avg_time = counter.groupby("球队")["用时"].mean().round(1).rename("平均用时(秒)")
result = pd.concat([result, avg_time], axis=1)
print(result)
输出结果:
反击次数 反击进球 反击成功率 平均用时(秒)
A队 5 2.0 40.0 9.0
B队 6 3.0 50.0 8.3
结论分析
| 指标 | A队 | B队 | |
|---|---|---|---|
| 反击次数 | 5 | 6 | B队发起反击更多 |
| 反击进球 | 2 | 3 | B队进球更多 |
| 反击成功率 | 40% | 50% | B队更高 |
| 平均用时 | 0s | 3s | B队反击更快 |
✅ 最终判定:B队反击更高效
理由:
- 次数更多:6次 vs 5次,说明B队更善于制造反击机会
- 成功率更高:50% vs 40%,把握机会能力更强
- 耗时更短:平均8.3秒完成一次反击,进攻更犀利
进阶:反击效率综合评分
如果要给一个"效率分",可以加权计算:
# 综合评分:成功率权重0.6,速度权重0.4(速度越快分越高)
max_time = result["平均用时(秒)"].max()
result["速度得分"] = (max_time / result["平均用时(秒)"] * 100).round(1)
result["综合效率分"] = (
result["反击成功率"] * 0.6 + result["速度得分"] * 0.4
).round(1)
print(result[["反击成功率", "速度得分", "综合效率分"]])
这样就能得到一个更直观的对比,B队依然胜出。
核心思路总结:统计反击不能只看次数,要结合"次数 + 转化率 + 速度"三个维度,用 groupby 分组聚合是最简洁的Python实现方式。