You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NBA球员DataFrame处理:筛选总出场时间超1000分钟的球员

解决NBA单赛季总出场时间筛选问题

问题核心

直接筛选MP > 1000的行存在漏洞——部分球员单赛季效力多支球队,单条记录的MP不足1000,但赛季总MP达标,会被误删。正确思路是利用RK列(同一球员的所有球队条目RK相同)分组计算总出场时间,再做筛选。

优化解决方案代码

从本地CSV文件读取数据

import pandas as pd

# 读取数据
league_stats = pd.read_csv("1996.csv")
# 移除冗余列
league_stats = league_stats.drop("Player-additional", axis=1)

# 按RK分组,计算每个球员的总MP,筛选出总MP>1000的RK
valid_rks = league_stats.groupby("RK")["MP"].sum()[lambda x: x > 1000].index

# 保留总MP达标的球员所有条目
league_stats_1000 = league_stats[league_stats["RK"].isin(valid_rks)]

# 如果只需要球员的赛季总览数据(对应Tm=TOT的行),可以再加一步筛选
# league_stats_1000_tot = league_stats_1000[league_stats_1000["Tm"] == "TOT"]

从Basketball-Reference网页直接读取数据

import pandas as pd

url = 'https://www.basketball-reference.com/leagues/NBA_1997_totals.html'
df = pd.read_html(url)[0]

# 处理网页数据的重复表头问题(Basketball-Reference会在中间插入重复表头)
df = df[df["RK"] != "RK"]
# 将数值列转为正确类型
df["MP"] = pd.to_numeric(df["MP"])
df["RK"] = pd.to_numeric(df["RK"])

# 按RK分组计算总MP,筛选达标球员的RK
valid_rks = df.groupby("RK")["MP"].sum()[lambda x: x > 1000].index

# 过滤出达标球员的所有记录
filtered_df = df[df["RK"].isin(valid_rks)]

# 可选:只保留每个球员的总览行(Tm=TOT),同时移除该球员的其他球队条目
# 先保留TOT行,再移除非TOT且RK在达标列表里的重复条目
tot_rows = filtered_df[filtered_df["Tm"] == "TOT"]
non_tot_rows = filtered_df[filtered_df["Tm"] != "TOT"]
# 找出已经有TOT行的RK,移除对应的非TOT行
rk_with_tot = tot_rows["RK"].unique()
filtered_df_clean = pd.concat([tot_rows, non_tot_rows[~non_tot_rows["RK"].isin(rk_with_tot)]])

代码解释

  1. 分组计算总MP:通过groupby("RK")["MP"].sum()得到每个球员的赛季总出场时间,筛选出总MP超过1000的RK编号。
  2. 过滤有效数据:用isin(valid_rks)保留所有达标球员的记录,避免误删多队效力的球员。
  3. 网页数据额外处理:Basketball-Reference的表格会在中间插入重复表头,需要先过滤掉;同时要把字符串类型的数值转为数值型,确保计算准确。
  4. 可选的去重优化:如果只需要每个球员的赛季总览数据(TOT行),可以保留TOT行并移除该球员的其他球队条目,避免重复展示同一球员的多队数据。

内容的提问来源于stack exchange,提问作者Fitzgerald

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:06:25