读取和修改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
相关产品推荐
相关产品推荐

