处理NBA数据绘图时遇NotImplementedError错误的解决方案咨询
PHI球队赛季身高数据处理与绘图错误解决
需求与问题重现
目标:处理NBA数据,提取PHI队每个赛季的最高、最矮球员身高,绘制身高随赛季变化的趋势图。
原代码:
nba8 = nba[nba['team_abbreviation'] == "PHI"] nba8 = nba8.groupby(['season', 'team_abbreviation']).agg({'player_height': ['min', 'max']}) nba8 = nba8.reset_index() x_ticks = nba8.index[::4] nba8.plot(x='season', y=['player_height', 'player_height'], kind='line') plt.xticks(x_ticks, nba8['season'][::4]) plt.xlabel('Season') plt.ylabel('Height (cm)') plt.title('Tallest and Shortest Player in Team "PHI" in Each Season') plt.show()
运行时触发错误:
NotImplementedError: Index._join_level on non-unique index is not implemented
错误原因
groupby配合agg生成了多层列索引,列名是类似('player_height', 'min')的元组格式。reset_index后列结构未被扁平化,后续plot时指定y=['player_height', 'player_height']无法正确匹配实际的两个统计列,导致索引关联逻辑触发未实现的操作。
修正方案
步骤1:扁平化聚合后的列名
对agg结果重命名列,将多层索引改为单层,明确区分最小身高和最大身高。
步骤2:修正绘图的y轴列指定
直接使用新的单层列名作为plot的y轴参数。
步骤3:优化x轴刻度显示(可选)
确保赛季刻度清晰不重叠。
修正后的完整代码:
import pandas as pd import matplotlib.pyplot as plt # 筛选PHI球队数据 nba8 = nba[nba['team_abbreviation'] == "PHI"] # 分组聚合并重命名列,扁平化索引 nba8 = nba8.groupby(['season', 'team_abbreviation'])['player_height'].agg(min_height='min', max_height='max').reset_index() # 生成x轴刻度索引(每4个赛季显示一个) x_ticks = nba8.index[::4] # 绘制折线图,指定正确的y轴列 nba8.plot(x='season', y=['min_height', 'max_height'], kind='line', figsize=(10,6)) # 设置x轴刻度 plt.xticks(x_ticks, nba8['season'].iloc[x_ticks], rotation=45) # 添加图表标注 plt.xlabel('Season') plt.ylabel('Height (cm)') plt.title('Tallest and Shortest Player Height in PHI Team by Season') plt.legend(['Shortest Player', 'Tallest Player']) plt.tight_layout() plt.show()
关键说明
- 用
agg(min_height='min', max_height='max')直接指定新列名,避免生成多层列索引 iloc[x_ticks]确保获取对应位置的赛季值,避免索引不匹配问题tight_layout()自动调整图表布局,防止标签被截断
内容的提问来源于stack exchange,提问作者axechivas
相关产品推荐
相关产品推荐

