篮球转身过人次数统计案例
下面用一个完整的Python案例演示如何统计多名球员的转身过人次数,并找出谁最多。

场景说明
假设我们有一段比赛事件数据(模拟),每个事件包含:球员、动作类型,我们需要统计每位球员的 "转身过人"(spin move)次数,并排序找出最多的人。
完整代码
from collections import Counter
import pandas as pd
# ========== 1. 模拟比赛事件数据 ==========
# 实际中这些数据可来自视频标注、追踪系统或API
events = [
{"player": "詹姆斯", "action": "转身过人"},
{"player": "詹姆斯", "action": "转身过人"},
{"player": "詹姆斯", "action": "投篮"},
{"player": "库里", "action": "转身过人"},
{"player": "库里", "action": "三分"},
{"player": "东契奇", "action": "转身过人"},
{"player": "东契奇", "action": "转身过人"},
{"player": "东契奇", "action": "转身过人"},
{"player": "东契奇", "action": "传球"},
{"player": "欧文", "action": "转身过人"},
{"player": "欧文", "action": "转身过人"},
{"player": "字母哥", "action": "扣篮"},
{"player": "字母哥", "action": "转身过人"},
]
# ========== 2. 方法一:使用 Counter(最简洁) ==========
spin_counts = Counter(
e["player"] for e in events if e["action"] == "转身过人"
)
print("=== 各球员转身过人次数 ===")
for player, cnt in spin_counts.most_common():
print(f"{player}: {cnt} 次")
# 找出最多的人(可能有并列)
max_cnt = max(spin_counts.values())
top_players = [p for p, c in spin_counts.items() if c == max_cnt]
print(f"\n转身过人最多:{'、'.join(top_players)},共 {max_cnt} 次")
# ========== 3. 方法二:使用 pandas(适合大数据) ==========
df = pd.DataFrame(events)
spin_df = df[df["action"] == "转身过人"]
result = (
spin_df.groupby("player")
.size()
.reset_index(name="转身过人次数")
.sort_values("转身过人次数", ascending=False)
.reset_index(drop=True)
)
print("\n=== pandas 统计结果 ===")
print(result)
# 取第一行即最多的球员
top = result.iloc[0]
print(f"\n最多球员:{top['player']},{top['转身过人次数']} 次")
# ========== 4. 可视化(可选) ==========
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文显示
plt.rcParams["axes.unicode_minus"] = False
result.plot(x="player", y="转身过人次数", kind="bar", color="steelblue", legend=False)"球员转身过人次数统计")
plt.ylabel("次数")
plt.tight_layout()
plt.show()
运行结果
=== 各球员转身过人次数 ===
东契奇: 3 次
詹姆斯: 2 次
欧文: 2 次
库里: 1 次
字母哥: 1 次
转身过人最多:东契奇,共 3 次
=== pandas 统计结果 ===
player 转身过人次数
0 东契奇 3
1 詹姆斯 2
2 欧文 2
3 库里 1
4 字母哥 1
最多球员:东契奇,3 次
关键点解析
| 步骤 | 说明 |
|---|---|
| 数据源 | 事件列表/CSV/数据库/视频标注结果 |
| 筛选 | action == "转身过人" 过滤出目标动作 |
| 计数 | Counter(轻量)或 groupby().size()(大数据、可扩展) |
| 取最大值 | max() + 列表推导处理并列最多的情况 |
| 可视化 | 柱状图直观对比 |
扩展思路
- 按动作别名统计:如果数据里有
"spin"、"转身"、"转身突破"等多种写法,先做标准化映射:alias = {"spin": "转身过人", "转身突破": "转身过人", "转身": "转身过人"} action = alias.get(e["action"], e["action"]) - 按时间段/节次统计:给事件加
quarter字段,用groupby(["player","quarter"])分析关键时刻。 - 真实数据接入:NBA 可接
nba_api,或用 CV(YOLO + 姿态估计)从比赛视频自动识别转身动作。
如果你有真实数据格式(CSV 列名、字段),可以贴出来,我帮你改造成能直接跑的版本。