存在year列却触发KeyError: 'year',绘制胜率折线图遇问题
问题分析与解决
KeyError: 'year' 排查方向
- 列名匹配问题:检查
match_map_stats.csv里的year列是否存在大小写、空格差异,比如实际列名是Year或year。可先执行代码确认列名:data = pd.read_csv("match_map_stats.csv") print(data.columns) # 打印所有列名,验证是否包含'year' - CSV分隔符错误:如果CSV用制表符或其他分隔符而非逗号,会导致列解析异常,可指定分隔符读取:
data = pd.read_csv("match_map_stats.csv", sep="\t") # 根据实际分隔符调整 - 数据文件异常:直接打开
match_map_stats.csv确认year列是否存在,或执行data.head()查看前几行数据验证。
代码逻辑修正及完整实现
原代码存在未定义变量、胜率计算逻辑错误等问题,以下是修正后的完整代码:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 读取数据,可选清理列名空格 data = pd.read_csv("match_map_stats.csv") # data.columns = data.columns.str.strip() # 若列名带空格则启用 # 筛选上海龙之队参与的控制地图对局 shanghai_control_matches = data[ (data["map_type"] == "control") & ((data["map_winner"] == "Shanghai Dragons") | (data["map_loser"] == "Shanghai Dragons")) ] # 按年份分组计算胜率 yearly_win_stats = shanghai_control_matches.groupby("year").agg( win_count=("map_winner", lambda x: (x == "Shanghai Dragons").sum()), total_matches=("map_winner", "count") ) yearly_win_stats["win_rate"] = round((yearly_win_stats["win_count"] / yearly_win_stats["total_matches"]) * 100, 2) # 绘制折线图 plt.figure(figsize=(10, 6)) plt.plot(yearly_win_stats.index, yearly_win_stats["win_rate"], marker='o', color='#1f77b4') plt.title("上海龙之队控制地图胜率随时间变化", fontsize=14) plt.xticks(rotation=30, ha='right') plt.xlabel("年份", fontsize=12) plt.ylabel("胜率(%)", fontsize=12) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
核心修正点
- 替换未定义的
df变量为data(原代码中control_df = df.loc[...]的df未初始化) - 重新梳理逻辑:先筛选目标对局数据,再按年份分组计算胜场数与总场数,最终得到胜率
- 修正绘图映射关系:X轴对应年份,Y轴对应对应年份的胜率,确保数据逻辑正确
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

