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
相关产品推荐
相关产品推荐

