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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:31:15