移除DataFrame中Race_Leader行并为各HorseId匹配赛事领跑数据
处理赛马赛事DataFrame:移除领跑者行并添加对应分段用时列
需求说明
我有一个记录赛马赛事分段用时的DataFrame,每个赛事都包含一行HorseId为0、名为Race_Leader的数据(代表赛事领跑者的分段用时,不是真实赛马)。需要完成:
- 移除所有
Race_Leader行 - 为每个真实赛马添加对应赛事的领跑者分段用时列(命名为
RL Sectionals)
示例输入
HorseId Name RaceId Sectionals 0 Race_Leader 123 41.3 224 Winx 123 42.4 225 Black Caviar 123 41.3 226 Rekindling 123 44.4 227 Fabergino 123 43.2
期望输出
HorseId Name RaceId Sectionals RL Sectionals 224 Winx 123 42.4 41.3 225 Black Caviar 123 41.3 41.3 226 Rekindling 123 44.4 41.3 227 Fabergino 123 43.2 41.3
解决方案
这里提供两种实用的pandas处理方式:
方法1:拆分数据后合并(直观易懂)
先提取领跑者的分段用时数据,再和真实赛马数据合并:
import pandas as pd # 假设你的原始DataFrame名为df # 1. 提取每个赛事的领跑者分段用时,只保留RaceId和新列RL Sectionals rl_sectionals = df[df['HorseId'] == 0].rename(columns={'Sectionals': 'RL Sectionals'})[['RaceId', 'RL Sectionals']] # 2. 筛选出真实赛马数据(排除HorseId=0的行) real_horses_df = df[df['HorseId'] != 0] # 3. 按RaceId合并数据,给每个赛马添加上对应赛事的领跑者用时 final_df = real_horses_df.merge(rl_sectionals, on='RaceId', how='left')
方法2:用transform分组广播(高效适合大数据集)
利用groupby+transform直接在原DataFrame上添加列,再过滤行:
import pandas as pd # 按RaceId分组,提取每组中HorseId=0的Sectionals值,广播到同组所有行 df['RL Sectionals'] = df.groupby('RaceId')['Sectionals'].transform( lambda group: group[df.loc[group.index, 'HorseId'] == 0].iloc[0] ) # 移除领跑者行,重置索引 final_df = df[df['HorseId'] != 0].reset_index(drop=True)
两种方法都能得到你想要的结果,方法2不需要拆分合并,处理大数量级数据时效率更高。
内容的提问来源于stack exchange,提问作者onthepunt
相关产品推荐
相关产品推荐

