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

存在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:30