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)]])
代码解释
- 分组计算总MP:通过
groupby("RK")["MP"].sum()得到每个球员的赛季总出场时间,筛选出总MP超过1000的RK编号。 - 过滤有效数据:用
isin(valid_rks)保留所有达标球员的记录,避免误删多队效力的球员。 - 网页数据额外处理:Basketball-Reference的表格会在中间插入重复表头,需要先过滤掉;同时要把字符串类型的数值转为数值型,确保计算准确。
- 可选的去重优化:如果只需要每个球员的赛季总览数据(TOT行),可以保留TOT行并移除该球员的其他球队条目,避免重复展示同一球员的多队数据。
内容的提问来源于stack exchange,提问作者Fitzgerald
相关产品推荐
相关产品推荐

