Если это может кому-то помочь, основываясь на ответе @ rahlf23, я изменил его, чтобы сделать его более общим, учитывая, что с одной стороны счетных столбцов может быть больше, и что помимо диапазона важно также быть включенным правая хромосома.
Итак, если таблица "a" равна:
feature Chromosome start end count1 count2 count3
gene1 Chr1 1 10 100 30 22
gene2 Chr1 15 40 20 10 6
gene3 Chr1 50 70 40 11 7
gene4 Chr1 100 150 23 15 9
gene5 Chr2 5 30 24 17 2
gene5 Chr2 40 80 4 28 16
и таблица "b":
feature Chromosome start end
range1 Chr1 1 45
range2 Chr1 55 160
range3 Chr2 10 90
range4 Chr2 100 200
со следующим скриптом Python:
import pandas as pd
def find_englobed(x):
englobed = a[(a['Chromosome'] == x['Chromosome']) & (a['start'].between(x['start'], x['end']) | (a['end'].between(x['start'], x['end'])))]
return englobed[list(a.columns[4:])].sum()
pd.concat([b, b.apply(find_englobed, axis=1)], axis=1)
Теперь с a['Chromosome'] == x['Chromosome'] &
я прошу, чтобы они были в одной и той же хромосоме, а с list(a.columns[4:])
я получаю все столбцы с 5-го до конца, независимо от количества столбцов подсчета.
Я получаю следующий результат:
feature Chromosome start end count1 count2 count3
range1 Chr1 1 45 120.0 40.0 28.0
range2 Chr1 55 160 63.0 26.0 16.0
range3 Chr2 10 90 28.0 45.0 18.0
range4 Chr2 100 200 0.0 0.0 0.0
Я не уверен, почему полученные числа с плавающей запятой ... какой-либо комментарий?