如何删除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
相关产品推荐
相关产品推荐

