使用replace方法后如何从DataFrame中筛选每个球员的首个赛季数据
问题根因
- 你调用的
sort_values、drop_duplicates两个方法默认都不会修改原DataFrame,而是返回新对象,你没有对返回结果赋值,因此排序、去重操作实际上都没有生效 - 排序规则不符合需求:你当前仅按球员名称排序,没有按赛季升序排列,无法保证每个球员的最早赛季排在分组的第一条
- 球员名称清洗逻辑冗余:手动匹配
*/+后缀、手动replace的方式容易漏匹配,增加不必要的代码量
修复方案
你可以直接用以下逻辑替换原有代码的末尾部分即可解决问题:
# 统一清洗球员名称,一次性去掉所有*、+后缀,无需手动逐个replace mid_data['Player'] = mid_data['Player'].str.strip('*+') # 先按球员名称升序、再按赛季升序排序,保证每个球员的最早赛季排在分组最前面 # 必须将排序结果赋值回变量,或者在方法中加inplace=True参数才能生效 final_data = mid_data[['Player', 'Tm'] + cols].sort_values(by = ['Player', 'Season'], ascending=True) # 去重保留每个球员第一条(即最早赛季)的记录,同样需要赋值回变量 final_data = final_data.drop_duplicates(subset = 'Player', keep='first')
如果需要进一步简化代码,原有构建mid_data的四次append逻辑也可以替换为更简洁的写法,无需循环逐个球员匹配:
mid_data = data_radar[data_radar['Player'].str.strip('*+').isin(player_list)].copy()
内容的提问来源于stack exchange,提问作者GLVieira
相关产品推荐
相关产品推荐

