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

如何删除Pandas中Tab2与Tab1对应物种坐标重叠的DataFrame行

实现方案

前置注意事项

  • Tab1的end列名末尾自带空格,需要先重命名去除空格,避免后续调用报错
  • 两个表的Species列大小写不一致,需要统一格式后再做匹配

核心逻辑

区间重叠判定条件:对于Tab1中同物种的区间[s1, e1]和Tab2的区间[s2, e2],满足s2 < e1 且 s1 < e2时判定为重叠,需要删除对应Tab2的行。

完整实现代码

import pandas as pd

# 构造两个DataFrame
tab1 = pd.DataFrame({
    'Species': {0: 'G1:Sp1', 1: 'G1:Sp1', 2: 'G1:Sp2'}, 
    'start': {0: 5, 1: 60, 2: 50}, 
    'end ': {0: 30, 1: 90, 2: 120}
})
# 处理Tab1的end列空格问题
tab1 = tab1.rename(columns={'end ': 'end'})
# 统一Species为大写避免匹配失败
tab1['Species'] = tab1['Species'].str.upper()

tab2 = pd.DataFrame({
    'Species': {0: 'G1:SP1', 1: 'G1:SP1', 2: 'G1:SP1', 3: 'G1:SP2', 4: 'G1:SP2', 5: 'G1:SP2', 6: 'G1:SP2'}, 
    'start': {0: 1, 1: 30, 2: 70, 3: 48, 4: 50, 5: 56, 6: 130}, 
    'end': {0: 4, 1: 59, 2: 93, 3: 110, 4: 120, 5: 124, 6: 170}
})
tab2['Species'] = tab2['Species'].str.upper()

# 判定当前行是否需要保留
def is_keep(row):
    # 取出同物种的Tab1所有区间
    same_species = tab1[tab1['Species'] == row['Species']]
    s2, e2 = row['start'], row['end']
    for _, r1 in same_species.iterrows():
        s1, e1 = r1['start'], r1['end']
        # 满足重叠条件则删除
        if s2 < e1 and s1 < e2:
            return False
    # 无任何重叠则保留
    return True

# 过滤得到结果
result = tab2[tab2.apply(is_keep, axis=1)].reset_index(drop=True)
print(result)

输出结果

运行代码后得到的结果与示例预期一致:

Species  start  end
0  G1:SP1      1    4
1  G1:SP1     30   59
2  G1:SP2     56  124
3  G1:SP2    130  170

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:54:01