У меня есть поведение, которое я не понимаю. Было бы замечательно, если бы кто-то мог объяснить, почему это работает, а также показать мне более хороший способ сделать это, это стало очень замысловатым.
Моя цель здесь - объединить генетические c варианты, которые находятся рядом с каждым другой на данной хромосоме. Это должно найти любую комбинацию вариантов длиной до 5 б.п. (позиция). Это означает, что если есть 5 позиций рядом друг с другом, все они должны быть объединены, и тогда эти позиции не должны проверяться снова. Затем то же самое для комбинаций длиной 4, 3, 2. Я обрабатываю эту строку с помощью этой строки 'для var_len в [5, 4, 3, 2, 1]:' и набора уже_популярных. Это решение работает, но только если я добавлю «tumour_alts» в список в моей df. Это почему? И может ли кто-нибудь показать мне, как получить тот же вывод, не прибегая к итерации?
df = pd.DataFrame([['chr1',13,['A']],
['chr1',5,['A']],
['chr1',6,['G']],
['chr2',9,['G']],
['chr1',4,['C']],
['chr1',11,['T']]],
columns=['chrom','pos','tumour_alts'],
index=['chr1:13','chr1:5','chr1:6','chr2:9','chr1:4','chr1:11'])
already_updated = set([])
for chrom, df_tmp in df.groupby('chrom'):
df_tmp = df_tmp.sort_values(by=['pos'])
for var_len in [5, 4, 3, 2, 1]:
df_tmp['dif'] = df_tmp.pos.diff(var_len)
hits=df_tmp[df_tmp['dif'] == var_len]
for hit in hits.pos:
rows = df_tmp[(df_tmp.pos <= hit) & (df_tmp.pos >= (hit - var_len))]
update = dict(rows.iloc[0])
for i in range(var_len):
i+=1
update_tmp = dict(rows.iloc[i])
key = update_tmp.get('chrom') + ':'+str(update_tmp.get('pos'))
if key not in already_updated:
df = df.drop(index=(key))
update['tumour_alts'][0]+=update_tmp.get('tumour_alts')[0]
already_updated.add(key)
df
chrom pos tumour_alts
chr1:13 chr1 13 [A]
chr2:9 chr2 9 [G]
chr1:4 chr1 4 [CAG]
chr1:11 chr1 11 [T]
Редактировать: я увеличил сложность, чтобы лучше описать проблему.
Учитывая:
df = pd.DataFrame([['chr1',13,['A']],
['chr1',3,['A']],
['chr1',5,['A']],
['chr1',6,['G']],
['chr2',9,['G']],
['chr1',4,['C']],
['chr1',11,['T']],
['chr1',55,['A']],
['chr1',56,['G']],
['chr2',95,['G']],],
columns=['chrom','pos','tumour_alts'],
index=['chr1:13','chr1:3','chr1:5','chr1:6','chr2:9','chr1:4','chr1:11','chr1:55','chr1:56','chr1:95'])
df = df.sort_values('pos').sort_values('chrom')
Я ожидаю:
chrom pos tumour_alts
chr1:3 chr1 3 [ACAG]
chr1:11 chr1 11 [T]
chr1:13 chr1 13 [A]
chr1:55 chr1 55 [AG]
chr2:9 chr2 9 [G]
chr2:95 chr2 95 [G]