Python 案例:统计低位防守解围次数
下面我用足球比赛数据统计为例,演示如何统计低位防守(Deep Defense)中的解围(Clearance)次数。

场景说明
- 低位防守:球队退防到本方半场(防守三区 = 球场后 1/3 区域)
- 解围:防守球员把球大脚踢出危险区域的动作
- 目标:统计球员在低位防守时的解围次数
完整代码
import pandas as pd
# ========== 1. 模拟比赛事件数据 ==========
data = {
"player": ["张三", "李四", "王五", "赵六", "张三", "李四", "王五", "赵六", "张三", "王五"],
"action": ["解围", "解围", "解围", "解围", "拦截", "解围", "解围", "犯规", "解围", "解围"],
# 事件发生的 x 坐标(0~100,0=本方球门,100=对方球门)
"x": [15, 25, 30, 10, 20, 18, 28, 40, 12, 22],
# 事件发生的 y 坐标(0~100)
"y": [50, 30, 60, 45, 55, 35, 65, 50, 40, 55],
}
df = pd.DataFrame(data)
# ========== 2. 定义低位防守区域 ==========
# 本方半场后 1/3:x < 33.3(防守三区)
LOW_DEFENSE_THRESHOLD = 100 / 3 # ≈ 33.33
# ========== 3. 筛选低位防守的解围 ==========
low_defense_clearance = df[
(df["action"] == "解围") &
(df["x"] < LOW_DEFENSE_THRESHOLD)
]
# ========== 4. 按球员统计次数 ==========
count_by_player = (
low_defense_clearance
.groupby("player")
.size()
.reset_index(name="低位解围次数")
.sort_values("低位解围次数", ascending=False)
)
# ========== 5. 输出结果 ==========
print("=== 低位防守解围明细 ===")
print(low_defense_clearance[["player", "x", "y"]])
print("\n=== 各球员低位防守解围次数 ===")
print(count_by_player)
print(f"\n总次数:{len(low_defense_clearance)}")
运行结果
=== 低位防守解围明细 ===
player x y
0 张三 15 50
1 李四 25 30
2 王五 30 60
3 赵六 10 45
5 李四 18 35
6 王五 28 65
8 张三 12 40
9 王五 22 55
=== 各球员低位防守解围次数 ===
player 低位解围次数
王五 3
张三 2
李四 2
赵六 1
总次数:8
关键点解析
| 步骤 | 说明 |
|---|---|
| 定义区域 | 用 x < 33.3 判断是否在低位防守区域(防守三区) |
| 双条件筛选 | 同时满足 action == "解围" 和 x < 阈值 |
| groupby 统计 | 按球员分组用 .size() 计数 |
| 排序 | 按次数降序,找出解围最多的球员 |
进阶:按比赛/球队统计
如果是多场比赛数据,可以这样聚合:
# 假设 df 中有 match_id 和 team 列
result = (
df[df["action"] == "解围"]
.query("x < @LOW_DEFENSE_THRESHOLD")
.groupby(["match_id", "team", "player"])
.size()
.reset_index(name="低位解围次数")
)
可视化(可选)
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示中文
plt.bar(count_by_player["player"], count_by_player["低位解围次数"])
plt.xlabel("球员")
plt.ylabel("低位防守解围次数")"各球员低位防守解围统计")
plt.show()
核心公式:
低位防守解围 =
action == "解围"ANDx < 球场长度 / 3
你可以把 x 阈值换成自定义的防守区域(x < 40 表示更宽的防守范围),适配不同战术定义,需要我根据真实数据(如 StatsBomb、Opta 格式)改写吗?