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

Pandas中.apply(lambda g: g.shift(1, fill_value=0).cumsum())细微错误排查

F1车手历史夺冠次数统计异常排查方案

以下是针对你的DataFrame新增Total_wins列时出现部分值异常的常见排查点及修复方案:

  • 数据排序逻辑错误
    若分组后未按赛事时间维度(如赛事年份+回合数/赛事日期)正确排序,会导致累计计算时顺序错乱,把当前赛事之后的夺冠记录提前计入。
    排查:检查数据是否先按车手唯一标识(如driver_id)+ 赛事时间字段完成全局排序。
    修复示例:

    # 按车手ID、赛事年份、回合数排序,确保赛事时间线正确
    df = df.sort_values(by=['driver_id', 'race_year', 'round_number'], ignore_index=True)
    
  • 累计计算未排除当前行
    直接使用groupby('driver_id')['win'].cumsum()会将当前行的夺冠记录计入统计,但需求是当前赛事之前的夺冠次数,导致部分行多算1次。
    排查:查看Total_wins是否在车手夺冠的那一行数值异常偏高。
    修复示例:

    # 先计算累计夺冠数,再下移一行排除当前行,初始值填充为0
    df['Total_wins'] = df.groupby('driver_id')['win'].cumsum().shift(1).fillna(0).astype(int)
    
  • 分组键不唯一
    若使用driver_name作为分组键,可能存在同名车手(历史上有重名的F1车手),导致不同车手的夺冠记录被合并计算;或driver_id存在缺失/重复值,引发分组混乱。
    排查:执行df['driver_id'].nunique()和df['driver_name'].nunique()对比,确认分组键的唯一性;检查df['driver_id'].isna().sum()是否有缺失值。
    修复:始终使用唯一标识driver_id作为分组键,避免用姓名分组。

  • 夺冠标识列格式错误
    若win列的取值不是标准的0/1(比如用字符串'Win'表示夺冠、存在NaN值),会导致cumsum()计算结果异常。
    排查:执行df['win'].value_counts()查看取值分布,确认无异常值或缺失值。
    修复示例:

    # 将夺冠标识统一转换为0/1格式,填充缺失值
    df['win'] = df['win'].replace({'Win': 1, 'No Win': 0}).fillna(0).astype(int)
    
  • 大数据量下的分组计算bug
    15万行数据属于较大数据集,旧版本pandas的groupby.apply()可能存在内存或计算逻辑bug,导致部分分组的累计值异常。
    排查:尝试用小批量数据测试同一逻辑,看是否仍有异常;检查pandas版本(建议升级到1.5.x及以上稳定版)。
    修复示例:

    # 用transform替代apply,提升大数据量下的计算稳定性
    df['Total_wins'] = df.groupby('driver_id')['win'].transform(lambda x: x.cumsum().shift(1)).fillna(0).astype(int)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:56:08