合并DataFrame后删除坠落点后续障碍记录的实现方案问询
问题:筛选坠落赛马的障碍记录(保留坠落点及之前的障碍)
现有两个DataFrame:
- Faller DF:办公室管理员录入的赛事赛马坠落记录,其中
fenceLabel和circuitNumber为手动录入,其余字段来自数据库 - Lookup Table:赛事障碍静态查找表,用于确定坠落位置的障碍序列
需要将两者合并为障碍级数据集,但需删除赛马未到达的后续障碍——仅保留坠落点及之前的障碍(即删除sequence值大于坠落点对应sequence的记录)。
数据结构
Falller DF
| fallerId | courseId | obstacleType | raceDistance | fenceLabel | circuitNumber | |----------|----------|--------------|--------------|------------|---------------| | 1 | 1 | steeple | 2500 | A | 1 | | 2 | 1 | steeple | 3500 | F | 1 | | 3 | 1 | water | 3500 | A | 2 | | 4 | 2 | steeple | 3000 | B | 1 | | 5 | 2 | steeple | 3000 | B | 2 |
Lookup Table(对应Falller DF第一条记录的赛事详情)
| courseId | obstacleType | raceDistance | startingfenceLabel | fenceLabel | circuitNumber | sequence | |----------|--------------|--------------|--------------------|------------|---------------|----------| | 1 | steeple | 2500 | C | C | 1 | 1 | | 1 | steeple | 2500 | C | D | 1 | 2 | | 1 | steeple | 2500 | C | E | 1 | 3 | | 1 | steeple | 2500 | C | A | 1 | 4 | | 1 | steeple | 2500 | C | B | 1 | 5 | | 1 | steeple | 2500 | C | C | 2 | 6 | | 1 | steeple | 2500 | C | D | 2 | 7 | | 1 | steeple | 2500 | C | E | 2 | 8 |
已完成左连接代码:
( faller.merge( lookup, on=["courseId", "obstacleType", "raceDistance"], how="left" ) )
最优实现方法
核心思路:先获取每个坠落记录对应的坠落点sequence值,再用该值过滤连接后的所有障碍记录,仅保留sequence小于等于坠落点sequence的行。
简化链式代码
final_df = ( faller # 第一步:匹配坠落点,获取对应的sequence值 .merge( lookup[["courseId", "obstacleType", "raceDistance", "fenceLabel", "circuitNumber", "sequence"]], on=["courseId", "obstacleType", "raceDistance", "fenceLabel", "circuitNumber"], how="left" ) .rename(columns={"sequence": "fall_sequence"}) # 第二步:连接所有障碍记录,筛选出坠落点及之前的内容 .merge( lookup, on=["courseId", "obstacleType", "raceDistance"], how="left" ) .query("sequence <= fall_sequence") )
代码说明
- 第一步通过精准匹配坠落点的
fenceLabel和circuitNumber,从Lookup Table中拿到该坠落点对应的sequence,并命名为fall_sequence,标记为该赛马的坠落位置序列值。 - 第二步将带坠落序列值的Faller DF与Lookup Table做左连接,获取该赛事的所有障碍记录后,用
query过滤出序列值不超过坠落点的记录,直接剔除未到达的后续障碍。 - 全程用pandas矢量化操作,避免逐行循环,效率更高,适合批量处理大规模数据。
内容的提问来源于stack exchange,提问作者Eoin Vaughan
相关产品推荐
相关产品推荐

