Скрипт Python для использования координат из одного файла и добавления значений из совпадающих координат в другой файл

У меня есть оригинальный набор геномных координат (chrom, start, end) в файле bed с разделителями табуляции. У меня также есть дополнительные файлы постели с разделителями табуляции, которые содержат некоторые исходные геномные координаты плюс числовое значение, связанное с каждой из этих координат. Эти координаты могут появляться несколько раз в файле постели с разными числовыми значениями каждый раз. Мне нужен окончательный файл постели, который содержит каждую из исходных геномных координат с суммированным числом всех найденных значений, связанных с этой конкретной координатой. Примеры файлов, с которыми я работаю, приведены ниже.

Исходный файл:

chr1    2100    2300

chr2    3300    3600

chr1    2560    2800

Другое Файл:

chr1    2100    2300    6

chr2    3300    3600    56

chr1    2100    2300    10

Требуется выходной файл:

chr1    2100    2300    16

chr2    3300    3600    56

chr1    2560    2800    0

Мне нужно написать скрипт Python для этого, но я не совсем уверен, что лучший способ сделать это.

2 ответа

Решение
def fetch_data(filename1, filename2):
    lines = []
    data = {}
    with open (filename1) as f:
        lines = f.readlines()

    for line in lines:
        if not line.strip():
            continue
        data[' '.join(line.split())] = 0

    with open (filename2) as f:
        lines = f.readlines()

    for line in lines:
        if not line.strip():
            continue
        arr = line.split()
        data[' '.join(arr[:-1])] += int(arr[3])

    return data


with open ('output.txt', 'w') as f:
    for key,value in fetch_data('original.txt','data.txt').iteritems():
        f.write('{0}    {1} \n\n'.format('    '.join(key.split()), str(value)))

Это одна из тех вещей, которые Pandas делает действительно легкими:

import pandas
coordnames = ['Name', 'x', 'y']
f1 = pandas.read_table('file1', delimiter=r' +', 
                       names=coordnames).dropna()
f2 = pandas.read_table('file2', delimiter=r' +', 
                       names=coordnames + ['n']).dropna()
result = (f1.merge(f2, on=coordnames, how='left')
          .groupby(coordnames).sum().fillna(0))
Другие вопросы по тегам