You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python按星期几绘制平均出勤散点图遇KeyError报错求助

解决按星期几计算平均出勤数并绘制散点图的KeyError问题

看起来你的代码里有几个关键问题导致了KeyError,我来帮你一步步梳理并修正:

错误原因分析

  1. 拼写错误:你写的attendace应该是attendance,虽然这不是直接触发KeyError的原因,但会导致后续无法正确获取出勤数列。
  2. 混用原始与处理后DataFrame:你创建了去除缺失值的new_df,但后续操作却修改了原始df的week列,这会导致两个DataFrame的索引不匹配,分组时出现键不存在的问题。
  3. 散点图参数错误:你调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:06:49