如何将按年份统计的平均电影时长DataFrame绘制成条形图?(含报错解决)
解决KeyError: 'release_year' 并绘制条形图
错误原因
执行groupby("release_year")["runtime"].mean()后,release_year会自动成为结果DataFrame的索引,而非普通列。所以你尝试用average_film_runtime["release_year"]访问它时,Pandas会在列名中查找该值,自然找不到,触发KeyError。
解决方法
有两种简单的修复方式:
方法1:重置索引,把release_year转回列
生成average_film_runtime后,调用reset_index()方法将索引转为普通列:
average_film_runtime = pd.DataFrame(averages_over_time).reset_index()
之后就能正常用average_film_runtime["release_year"]作为x轴数据。
方法2:直接使用DataFrame的索引作为x轴
既然release_year是索引,直接用average_film_runtime.index获取年份数据即可,无需转列:
plt.bar(average_film_runtime.index, average_film_runtime["runtime"])
完整修改后的代码(绘制条形图)
这里提供方法1的完整代码,同时将原折线图改为你需求的条形图:
import pandas as pd import matplotlib.pyplot as plt # 读取数据 netflix = pd.read_csv('titles.csv') # 筛选符合条件的电影 movie_filter = netflix[(netflix["type"] == "MOVIE") & (netflix["runtime"] > 60)] # 按年份计算平均时长 averages_over_time = movie_filter.groupby("release_year")["runtime"].mean() average_film_runtime = pd.DataFrame(averages_over_time).reset_index() # 绘制条形图 plt.bar(average_film_runtime["release_year"], average_film_runtime["runtime"]) plt.xlabel('发行年份') plt.ylabel('平均电影时长(分钟)') plt.title('Netflix电影平均时长随年份变化') plt.xticks(rotation=45) # 旋转年份标签避免重叠 plt.tight_layout() # 自动调整布局防止标签截断 plt.show()
若使用方法2,代码可简化为:
import pandas as pd import matplotlib.pyplot as plt netflix = pd.read_csv('titles.csv') movie_filter = netflix[(netflix["type"] == "MOVIE") & (netflix["runtime"] > 60)] averages_over_time = movie_filter.groupby("release_year")["runtime"].mean() plt.bar(averages_over_time.index, averages_over_time.values) plt.xlabel('发行年份') plt.ylabel('平均电影时长(分钟)') plt.title('Netflix电影平均时长随年份变化') plt.xticks(rotation=45) plt.tight_layout() plt.show()
额外提示
- 不确定DataFrame结构时,可执行
print(average_film_runtime.head())查看,能清晰区分列和索引。 - 旋转x轴标签和调用
plt.tight_layout()是为了提升图表可读性,避免年份标签重叠。
内容的提问来源于stack exchange,提问作者Froman
相关产品推荐
相关产品推荐

