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

合并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")
)

代码说明

  1. 第一步通过精准匹配坠落点的fenceLabel和circuitNumber,从Lookup Table中拿到该坠落点对应的sequence,并命名为fall_sequence,标记为该赛马的坠落位置序列值。
  2. 第二步将带坠落序列值的Faller DF与Lookup Table做左连接,获取该赛事的所有障碍记录后,用query过滤出序列值不超过坠落点的记录,直接剔除未到达的后续障碍。
  3. 全程用pandas矢量化操作,避免逐行循环,效率更高,适合批量处理大规模数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:45:05