如何在pandas dataframe迭代时跳过行,正确计算教练更替胜率变化
问题原因
- 循环逻辑错误:你在if判断的执行块里加了一次
i = i + 1,循环末尾又加了一次,触发教练不同的判断时,i会直接加2跳过下一行的校验,逻辑完全混乱。 - 链式索引问题:
celtics["Change in W/L%"].loc[i]这种写法属于链式索引,pandas会返回副本而不是原DataFrame的视图,赋值操作经常无法作用到原数据,甚至会意外覆盖其他行的值,这就是教练相同的行也被写入差值的核心原因。 - 额外说明:用while循环遍历pandas行本身效率极低,处理稍大的数据量时性能会非常差。
修复方案
临时修复原有循环
删掉if块里多余的i递增,同时修改.loc的写法避免链式索引:
i = 0 while i < len(celtics) - 1: curr_coach = celtics.loc[i, "Coaches"].split("(")[0] next_coach = celtics.loc[i+1, "Coaches"].split("(")[0] if curr_coach != next_coach: celtics.loc[i, "Change in W/L%"] = celtics.loc[i, "W/L%"] - celtics.loc[i+1, "W/L%"] i += 1
推荐使用pandas向量化操作
完全不需要写循环,用内置函数实现,性能更高、逻辑更清晰、不会出现索引错误:
# 提取所有行的教练姓名(去掉括号后内容) coach_names = celtics["Coaches"].str.split("(").str[0] # 生成和下一行教练不同的行的布尔掩码 coach_changed_mask = coach_names != coach_names.shift(-1) # 仅对符合条件的行赋值胜率差值 celtics.loc[coach_changed_mask, "Change in W/L%"] = celtics["W/L%"] - celtics["W/L%"].shift(-1)
内容的提问来源于stack exchange,提问作者prismarine
相关产品推荐
相关产品推荐

