Pandas DataFrame按行统计后代数量并计算后代参赛总场次的实现方法
现有代码存在两个核心问题:
- 逐行
apply属于O(n²)时间复杂度的操作,每一行都要全表扫描两次匹配父本母本ID,大数据量下运行极慢 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
相关产品推荐
相关产品推荐

