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

Pandas DataFrame按行统计后代数量并计算后代参赛总场次的实现方法

现有代码存在两个核心问题:

  1. 逐行apply属于O(n²)时间复杂度的操作,每一行都要全表扫描两次匹配父本母本ID,大数据量下运行极慢
  2. groupby.apply方法不支持axis参数,你误用了DataFrame.apply的参数,因此触发报错

优化解决方案

采用分组聚合后关联回原表的思路,全程使用Pandas原生向量化操作,百万级数据也可秒级计算完成:

import pandas as pd

df = pd.read_csv(r'C:\Users\PC\Documents\ZedRun\exampledf.csv')

# 统计所有父本的后代数量、后代参赛总场次
sire_stats = df.groupby('Sire_horse_id').agg(
    sire_cnt=('Sire_horse_id', 'count'),
    sire_race_sum=('Races', 'sum')
).reset_index().rename(columns={'Sire_horse_id': 'horse_id'})

# 统计所有母本的后代数量、后代参赛总场次
dam_stats = df.groupby('Dam_horse_id').agg(
    dam_cnt=('Dam_horse_id', 'count'),
    dam_race_sum=('Races', 'sum')
).reset_index().rename(columns={'Dam_horse_id': 'horse_id'})

# 把父本、母本的统计结果关联到原表的对应马匹上
df = df.merge(sire_stats, on='horse_id', how='left')\
       .merge(dam_stats, on='horse_id', how='left')\
       .fillna(0) # 没有后代的马匹统计值填充为0

# 计算最终需要的两个字段
df['Offspring'] = df['sire_cnt'] + df['dam_cnt']
df['Offspring races'] = df['sire_race_sum'] + df['dam_race_sum']

# 清理计算过程中的临时字段,和示例输出格式对齐
df = df.drop(columns=['horse_type', 'sire_cnt', 'dam_cnt', 'sire_race_sum', 'dam_race_sum'])

print(df)

ID用法区分

  • 统计某匹马作为父本的后代数据时,以Sire_horse_id为分组键,此时分组键的值就是父本的horse_id
  • 统计某匹马作为母本的后代数据时,以Dam_horse_id为分组键,此时分组键的值就是母本的horse_id
  • 最终把两类统计结果和原表的horse_id关联,就能得到每匹马作为父/母本的总后代数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:27:01