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

读取和修改DataFrame单元格时出现KeyError问题求助

解决NFL赛事数据集合并主客场信息的问题

问题根源分析

你的循环代码在处理210条数据后停止,大概率是以下原因:

  • 数据集行数不是偶数,导致循环到最后时i+1超出索引范围,触发报错中断
  • VH列存在异常值(比如空值、小写的'h'/'v'、或其他字符),两个if条件都不匹配,后续逻辑无法执行
  • 逐行修改DataFrame的效率极低,数据量较大时容易出现卡顿或崩溃

最优解决方案:用Pandas分组替代循环

Pandas的核心优势是向量化操作,完全不需要用循环逐行处理。以下是高效实现的步骤:

1. 创建比赛分组键

因为每场比赛对应两行数据,直接用索引整除2生成分组标识:

n2r['game_group'] = n2r.index // 2

2. 分组提取主客场球队

通过groupby一次性提取每场比赛的主客场队伍:

# 分组后聚合主客场信息
game_teams = n2r.groupby('game_group').agg(
    Home=('Team', lambda x: x[n2r.loc[x.index, 'VH'] == 'H'].iloc[0]),
    Away=('Team', lambda x: x[n2r.loc[x.index, 'VH'] == 'V'].iloc[0])
).reset_index()

# 将主客场信息合并回原数据集
n2r = n2r.merge(game_teams, on='game_group', how='left')

3. 压缩为每场一行(可选)

如果需要直接得到每场比赛一行的数据集,直接使用game_teams即可,或者合并其他比赛相关字段:

# 提取每场比赛的其他信息(比如比分、日期),以第一行为例
game_summary = n2r.groupby('game_group').first().reset_index()
# 合并主客场信息
final_df = game_summary.merge(game_teams, on='game_group', how='left')

若坚持使用循环:增加异常处理

如果一定要保留循环逻辑,必须加入数据校验和异常处理,避免突然中断:

import numpy as np

n2r['Home'] = 0
n2r['Away'] = 0

# 先检查行数是否为偶数,奇数则截断最后一行
if n2r.shape[0] % 2 != 0:
    print("警告:数据集行数为奇数,最后一行将被忽略")
    n2r = n2r.iloc[:-1]

# 遍历每个比赛的两行数据
for i in np.arange(0, n2r.shape[0], 2):
    vh_current = n2r.at[i, 'VH']
    vh_next = n2r.at[i+1, 'VH']
    
    # 校验两行是否为一主一客
    if {vh_current, vh_next} != {'H', 'V'}:
        print(f"跳过异常行:第{i}和{i+1}行的VH值为{vh_current}、{vh_next}")
        continue
    
    # 确定主客场球队
    home_team = n2r.at[i, 'Team'] if vh_current == 'H' else n2r.at[i+1, 'Team']
    away_team = n2r.at[i, 'Team'] if vh_current == 'V' else n2r.at[i+1, 'Team']
    
    # 赋值到两行
    n2r.loc[[i, i+1], 'Home'] = home_team
    n2r.loc[[i, i+1], 'Away'] = away_team

前置数据校验建议

在处理前先排查数据问题,避免后续异常:

# 检查VH列的所有唯一值
print("VH列唯一值:", n2r['VH'].unique())
# 检查行数是否为偶数
print("数据集总行数:", n2r.shape[0], "是否为偶数:", n2r.shape[0] % 2 == 0)

内容的提问来源于stack exchange,提问作者Akorts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:10:35