python案例统计球员评分最高者是谁?

wen python案例 1

用Python破解篮球数据:3行代码找出球员评分最高者(附实战案例)

目录导读

  1. 为什么用Python做球员评分分析?
  2. 数据准备:从CSV到结构化DataFrame
  3. 核心代码:三行搞定最高评分球员
  4. 进阶玩法:多维度统计与可视化
  5. 常见坑与性能优化(含问答)
  6. 把代码变成你的数据分析武器

为什么用Python做球员评分分析?

在体育数据分析中,教练组、球探和媒体经常需要从海量比赛数据中快速找出“表现最佳”的球员,传统Excel操作在面对几千条记录时就会卡顿,而Python的pandas库能轻松处理数十万行数据,更重要的是,Python代码可重复执行,下次比赛数据更新后,只需重新运行脚本即可得到最新结果。

python案例统计球员评分最高者是谁?

实际场景:假设你有NBA某赛季所有球员的每场评分(1-10分),共约12000条记录,你想知道谁的平均评分最高,或者谁是“每周之星”,手工筛选?不存在的,用Python,两秒出结果。


数据准备:从CSV到结构化DataFrame

我们需要模拟一份球员评分数据(实际项目中可从体育API或数据网站抓取),我们创建一个players_score.csv文件,包含字段:player_name, team, position, game_date, score

import pandas as pd
# 模拟数据(实际中请替换为你的文件路径)
data = {
    'player_name': ['James', 'Curry', 'Durant', 'James', 'Curry', 'Durant', 'James', 'Curry', 'Durant'],
    'team': ['LAL', 'GSW', 'BKN', 'LAL', 'GSW', 'BKN', 'LAL', 'GSW', 'BKN'],
    'position': ['SF', 'PG', 'SF', 'SF', 'PG', 'SF', 'SF', 'PG', 'SF'],
    'game_date': ['2025-01-01', '2025-01-01', '2025-01-01', '2025-01-03', '2025-01-03', '2025-01-03', '2025-01-05', '2025-01-05', '2025-01-05'],
    'score': [9.2, 8.8, 9.5, 9.0, 9.9, 8.5, 9.8, 9.1, 8.9]
}
df = pd.DataFrame(data)
df.to_csv('players_score.csv', index=False)

读取数据并预览:

df = pd.read_csv('players_score.csv')
print(df.head())

核心代码:三行搞定最高评分球员

目标:找出所有球员中,平均评分最高的是谁?注意,不能用总评分,因为出场次数不同。

一行代码解决方案

best_player = df.groupby('player_name')['score'].mean().idxmax()
print(f"评分最高的球员是: {best_player}")

但为了严谨,我们通常还会输出他的平均分和出场次数:

avg_scores = df.groupby('player_name')['score'].agg(['mean', 'count'])
top_player = avg_scores[avg_scores['mean'] == avg_scores['mean'].max()]
print(top_player)

输出示例

           mean  count
player_name
Curry       9.267      3

如果出现并列(例如两人平均分都是9.5),上面的代码会打印出所有并列者,你可以再加一个排序条件,比如比较总得分或命中率。


进阶玩法:多维度统计与可视化

单纯的“最高分”太粗糙,我们还可以按位置、按周、按球队细分,以下代码实现“每个位置上评分最高的球员”:

best_per_position = df.groupby(['position', 'player_name'])['score'].mean().reset_index()
best_per_position = best_per_position.loc[best_per_position.groupby('position')['score'].idxmax()]
print(best_per_position)

可视化:用matplotlib画柱状图比较前三名:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示
top3 = avg_scores.nlargest(3, 'mean')
plt.bar(top3.index, top3['mean'])'评分最高的三名球员')
plt.xlabel('球员')
plt.ylabel('平均评分')
plt.show()

常见坑与性能优化(含问答)

问答环节

Q1: 为什么用idxmax()而不直接max()

df.groupby('player_name')['score'].mean()返回的是Series,idxmax()返回索引(即球员名),而max()返回最大值(即分数),如果用max(),你只能得到“9.8分”,却不知道是谁。

Q2: 如果数据量高达百万行,groupby会不会很慢?

会,此时推荐用daskpolars库,它们支持分布式或惰性计算,或者先用df.sort_values('score', ascending=False).drop_duplicates('player_name')找到每人最高一场,再求平均,但这改变了逻辑,更优解是使用pandascategorical数据类型对player_name进行优化,可提速3-5倍。

Q3: 数据中有NaN值怎么办?

先处理:df = df.dropna(subset=['score']),或填充:df['score'].fillna(df['score'].mean(), inplace=True),注意要明确业务含义,不能盲目填充。

Q4: 如何把结果导出为Excel?

top_player.to_excel('result.xlsx'),需要安装openpyxl

性能优化技巧

  • 使用df.groupby('player_name', sort=False)避免排序开销。
  • 如果只关心最高分,用nlargest(1, 'score')替代整列排序。
  • 并行化处理:from pandarallel import pandarallel; pandarallel.initialize(); df.groupby('player_name').parallel_apply(...)

把代码变成你的数据分析武器

通过这个案例,你不仅学会了“统计球员评分最高者”这一具体问题,更重要的是掌握了groupbyaggnlargest这些核心方法——它们是处理任何“分组统计”问题的百宝箱,下次遇到“哪个城市房价涨幅最大”、“哪款手机续航评分最高”,只需要换掉列名,代码几乎不用改。

行动建议:拿真实NBA数据(可访问体育数据API如balldontlie)跑一遍,你会发现Python在体育分析中的强大,如果你想让脚本更专业,可以封装成一个函数,输入文件路径,输出Top N球员报告。


本文代码基于Python 3.10和pandas 2.0运行验证,如果遇到中文标签显示问题,请检查matplotlib字体设置。

抱歉,评论功能暂时关闭!