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

pandas多表join与groupby分组统计未得到各赛道最快圈速预期结果

问题原因&修正方案

你现有代码的核心错误出在排序参数配置上,同时没有处理字符串格式圈速的排序准确性问题,具体修改如下:

错误点说明

  • sort_values 传入了axis=1参数,该参数代表按列维度排序,完全偏离了「按圈速从小到大排序」的需求,导致排序结果错乱,是你输出单赛道出现多条冗余记录的核心原因
  • 直接对字符串格式的fastestLapTime排序,可能出现字典序和实际时间大小不一致的情况,比如1:10.000字典序会比0:59.000大,但实际时间更长
  • 选取分组首行的逻辑可以进一步优化,避免排序全表带来的性能损耗

修正后代码

import pandas as pd

# 读取CSV文件
results_df = pd.read_csv('data/results.csv')
races_df = pd.read_csv('data/races.csv')
drivers_df = pd.read_csv('data/drivers.csv')

# 关联比赛结果和比赛基础信息
fastest_lap = pd.merge(results_df, races_df, on='raceId', how='inner')
# 过滤掉无有效圈速的记录
fastest_lap = fastest_lap[fastest_lap["fastestLapTime"] != '\\N']
# 关联车手基础信息
driver_lap_time_by_circuit = pd.merge(fastest_lap, drivers_df, on="driverId", how="inner")
# 保留需要的字段
driver_lap_time_by_circuit = driver_lap_time_by_circuit[["circuitId","forename","fastestLapTime","name"]]

# 新增:将字符串格式的圈速转换为总秒数,用于准确排序
def lap_time_to_seconds(time_str):
    minutes, seconds = time_str.split(':')
    return int(minutes) * 60 + float(seconds)
driver_lap_time_by_circuit['lap_seconds'] = driver_lap_time_by_circuit['fastestLapTime'].apply(lap_time_to_seconds)

# 修正:按赛道分组后,取每个赛道圈速最小的那条记录
fastest_lap_by_circuit = driver_lap_time_by_circuit.loc[driver_lap_time_by_circuit.groupby("circuitId")['lap_seconds'].idxmin()]
# 去掉辅助计算的秒数字段,恢复需要的输出字段顺序
fastest_lap_by_circuit = fastest_lap_by_circuit[["circuitId","name","forename","fastestLapTime"]].reset_index(drop=True)

print(fastest_lap_by_circuit)

核心修改说明

  • 移除了错误的axis=1排序参数,新增了圈速转秒数的逻辑,保证排序完全符合时间大小规则
  • 改用groupby.idxmin直接提取每个赛道最快圈速对应的行,无需全表排序,性能更高结果也更准确
  • 最后重置了索引,保证输出每个赛道对应唯一一条记录,和预期输出结构一致

内容的提问来源于stack exchange,提问作者a.comino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:21:00