批量处理NBA赛季球员统计DataFrame的技术问询
完整解决方案
1. 定义单DataFrame处理函数
先封装一个处理单赛季DataFrame的函数,把所有操作整合进去,逻辑清晰且便于批量复用:
import pandas as pd def process_nba_season_df(df): # 步骤1:转换MP列数据类型(处理千分位逗号+转int) df['MP'] = df['MP'].str.replace(',', '').astype(int) # 步骤2:去重Rk并保留TOT汇总行,再筛选MP≥1000的记录 # 标记是否为TOT汇总行,方便排序优先保留 df['is_tot'] = df['Team'] == 'TOT' # 按球员编号分组,优先保留TOT行;无TOT则保留单队记录 df_unique = df.sort_values(by=['Rk', 'is_tot'], ascending=[True, False])\ .groupby('Rk').first().reset_index() # 筛选出场时长达标记录,清理临时标记列 df_filtered = df_unique[df_unique['MP'] >= 1000].drop(columns='is_tot') # 步骤3:列间代数运算 # 新增球员级衍生列(如每分钟得分) df_filtered['PTS_per_MP'] = df_filtered['PTS'] / df_filtered['MP'] # 计算赛季级汇总指标(可按需扩展) season_summary = { 'total_pts_per_total_mp': df_filtered['PTS'].sum() / df_filtered['MP'].sum(), 'avg_pts_per_player': df_filtered['PTS'].sum() / len(df_filtered) } return df_filtered, season_summary
2. 批量处理DataFrame列表
之前循环修改无效,大概率是没把处理后的结果重新赋值回列表,用循环+列表存储即可解决:
# 假设你的原始DataFrame列表是df_list processed_seasons = [] season_summaries = [] for raw_df in df_list: cleaned_df, summary = process_nba_season_df(raw_df) processed_seasons.append(cleaned_df) season_summaries.append(summary) # processed_seasons就是处理完成的16个赛季DataFrame # season_summaries对应每个赛季的汇总统计值
关键细节说明
- MP类型转换:兼容NBA数据里常见的千分位逗号格式(如"1,500"),避免转换时报错;如果你的数据没有逗号,可去掉
str.replace(',', '')。 - 去重逻辑:通过排序让TOT汇总行排在同球员记录的最前面,再按球员编号分组取第一行,确保多队效力的球员只保留汇总数据;单队球员则保留唯一记录。
- 批量处理有效性:通过循环将处理后的DataFrame存入新列表,避免原始列表未更新的问题。
内容的提问来源于stack exchange,提问作者Fitzgerald
相关产品推荐
相关产品推荐

