Pandas如何筛选positionOrder=1的记录统计F1车手胜场排名
问题根因
现有代码未在聚合前筛选冠军记录,所有完赛名次(1-39位)的数据都参与了分组计数,因此非第一名的完赛记录会出现在最终排序结果中。另外原代码存在冗余步骤和国籍字段匹配错位的问题,会导致车手国籍统计错误。
修改方案
两表关联完成后,先过滤出positionOrder值为1的冠军记录,再基于过滤后的数据集做分组聚合即可,同时可以直接实现你需要的Top20车手、Top10国家统计需求。
修改后可运行的完整代码:
import pandas as pd # 读取源文件 driv_df = pd.read_csv('drivers.csv') resu_df = pd.read_csv('results.csv') # 关联车手基础信息和完赛结果 merge_df = pd.merge(resu_df, driv_df, on='driverId', how='inner') # 核心步骤:仅保留冠军完赛记录,过滤所有其他名次数据 win_records = merge_df[merge_df['positionOrder'] == 1].copy() # 1. 统计胜场Top20车手 driver_top20 = win_records.groupby(['driverRef', 'nationality']) .size() .sort_values(ascending=False) .reset_index(name='win_count') .head(20) # 2. 统计胜场总数Top10国家 nation_top10 = win_records.groupby('nationality') .size() .sort_values(ascending=False) .reset_index(name='total_win') .head(10) # 打印结果验证 print("=== 胜场Top20车手 ===") print(driver_top20) print("\n=== 胜场Top10国家 ===") print(nation_top10) # 导出结果文件 driver_top20.to_csv('driver_win_top20.csv', index=False) nation_top10.to_csv('nation_win_top10.csv', index=False)
关键修改点说明
- 把过滤冠军记录的步骤前置到所有聚合操作之前,从数据源层面排除非第一名的数据,后续统计不会再混入其他名次的记录
- 移除原代码中冗余的全名次分组、分步join国籍的无效逻辑,分组时直接从关联后的宽表取需要的字段,避免国籍匹配错位
- 直接通过
head(20)、head(10)拿到需要的TopN排名结果,导出时加index=False避免生成无意义的行号列 - 移除了代码中未使用的
sys、csv导入,同名字段关联时直接用on参数简化写法
内容的提问来源于stack exchange,提问作者Spenny
相关产品推荐
相关产品推荐

