Python按星期几绘制平均出勤散点图遇KeyError报错求助
解决按星期几计算平均出勤数并绘制散点图的KeyError问题
看起来你的代码里有几个关键问题导致了KeyError,我来帮你一步步梳理并修正:
错误原因分析
- 拼写错误:你写的
attendace应该是attendance,虽然这不是直接触发KeyError的原因,但会导致后续无法正确获取出勤数列。 - 混用原始与处理后DataFrame:你创建了去除缺失值的
new_df,但后续操作却修改了原始df的week列,这会导致两个DataFrame的索引不匹配,分组时出现键不存在的问题。 - 散点图参数错误:你调用
plot.scatter时传入了原始df的列,但分组后的聚合结果是汇总后的均值,两者的索引和数据维度不匹配,直接引发KeyError。
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt # 定义星期的展示顺序,确保绘图时按逻辑顺序排列 days = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'] # 读取Excel数据 log_2010 = pd.read_excel('GL2010-2017.xlsx') # 构建DataFrame,注意列名拼写正确:attendance df = pd.DataFrame({ 'years': log_2010['years'], 'attendance': log_2010['attendance'], 'week': log_2010['day_of_week'] }) # 移除包含缺失值的行 new_df = df.dropna(how='any') # 将日期列转换为datetime类型(使用处理后的new_df,避免索引不匹配) new_df['years'] = pd.to_datetime(new_df['years'], format='%Y%m%d') # 将week列设置为有序分类,确保分组和绘图时按指定顺序展示 new_df['week'] = pd.Categorical(new_df['week'], categories=days, ordered=True) # 按星期分组,计算平均出勤数,并重置索引为普通列 weekly_avg = new_df.groupby('week')['attendance'].mean().reset_index() # 绘制散点图 plt.scatter(weekly_avg['week'], weekly_avg['attendance']) plt.xlabel('Day of Week') plt.ylabel('Average Attendance') plt.title('Average Attendance by Day of Week') plt.show()
关键修正点说明
- 统一使用处理后数据:全程基于
new_df操作,避免原始数据和清洗后数据的索引混乱,从根源上解决KeyError。 - 有序分类设置:把
week设为有序分类后,分组和绘图时会严格按照你定义的days顺序展示,而不是默认的字母排序,结果更符合逻辑。 - 聚合后数据绘图:先通过
groupby计算出每个星期的平均出勤数,再用这个汇总后的数据集绘图,确保数据维度匹配,不会出现键不匹配的问题。 - 拼写修正:修正了
attendace的拼写错误,避免因列名不存在导致的隐性问题。
内容的提问来源于stack exchange,提问作者Muhammad Ahmed
相关产品推荐
相关产品推荐

