У меня есть файл кровати:
chr start stop strand count
chr1 0 13320 - 1
chr1 13320 13321 - 2
chr1 13321 13328 - 1
chr1 13328 13342 - 2
chr1 13342 13343 - 18
chr1 13343 13344 - 36
chr1 13344 13345 - 18
chr1 13345 13346 - 6
chr1 13346 16923 - 1
chr1 16923 16942 - 3
chr1 16942 16943 - 2
, и я хотел бы отфильтровать позицию, где count = 1, объединяет перекрывающиеся позиции в интервале между положением, где count = 1, и выводит медианное значение count .
Ожидаемый результат в этом случае:
chr1 13320 13321 2
chr1 13328 13346 18
chr1 16923 16943 2.5
Я написал следующий скрипт, который выполнил задание:
from pathlib import Path
import pandas as pd
file = Path("bed_file.bed")
# load with pandas
df = pd.read_csv(file, sep='\t', header=None)
# set colnames
header = ['chr','start','stop','strand','count']
df.columns = header[:len(df.columns)]
# index where count=1
col_count = df['count'].tolist()
li = [i for i, n in enumerate(col_count) if n == 1]
# create new dataframe
newDF = pd.DataFrame(columns=['chr','start', 'stop', 'count'])
# last position
end = df.index[-1]
# parse dataframe
for idx, elem in enumerate(li):
if elem != li[-1]:
next_elem = li[(idx + 1) % len(li)] # next element where count=1
start = df.iloc[elem]['stop'] # start position
stop = df.iloc[next_elem-1]['stop'] # stop position
if next_elem - (elem+1) == 1: # cases where only one position and we cannot compute median
count = df.iloc[elem+1]['count']
#print(f"start={start}\tstop={stop}\tcount={count}")
else:
count = df.iloc[elem+1:next_elem]['count'].median()
#print(f"start={start}\tstop={stop}\tcount={count}")
newDF = newDF.append({
'chr' : df.loc[0,'chr'],
'start' : start,
'stop' : stop,
'count' : count
},ignore_index=True)
else: # last element in the list
start = df.iloc[elem]['stop']
stop = df.iloc[end]['stop']
count = df.iloc[elem+1:end+1]['count'].median()
#print(f"start={start}\tstop={stop}\tcount={count}")
newDF = newDF.append({
'chr' : df.loc[0,'chr'],
'start' : start,
'stop' : stop,
'count' : count
},ignore_index=True)
Есть ли лучший способ сделать это? Это скрипт pythoni c?! Я бы хотел улучшить свои python навыки программирования :) Заранее спасибо!