Python: столбец суммы, если совпадает - PullRequest
0 голосов
/ 15 мая 2018

У меня есть огромный файл с тысячами строк, который выглядит следующим образом:

`C509.TCGA-78-7159-10A-01D-2036-08.1-C509.  1   0   0   1   0   0
 C509.TCGA-78-7159-10A-01D-2036-08.1-C509.  0   1   1   0   1   1`

Если первый столбец строк совпадает, я хочу суммировать второй столбец одной строки со вторым столбцом второй строки, третьейс третьим и т. д., без использования панд .И, вероятно, было бы лучше использовать python, а не awk из-за размера.

Вывод должен быть:

C509.TCGA-78-7159-10A-01D-2036-08.1-C509. 1 1 1 1 1 1

Спасибовам за помощь:)

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Вы можете использовать что-то вроде этого:

import re

res = dict()

with open("mydata.txt") as f:
  for line in f:
    id, col1, col2, col3, col4, col5, col6 = re.split(r"\s+", line)
    res.setdefault(id, [0] * 6)
    res[id][0] += int(col1)
    res[id][1] += int(col2)
    res[id][2] += int(col3)
    # ... and so on for the rest of cols

вывод для вашего ввода:

print(res)
{'C509.TCGA-78-7159-10A-01D-2036-08.1-C509.': [1, 1, 1, 1, 1, 1]}
0 голосов
/ 15 мая 2018

Если вы загрузите свои данные в Python в виде списка списков, вы можете сделать следующее

from operator import add

data = [['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   0,   0],
        ['C509.TCGA-78-7159-10A-01D-2036-08.1-C510.',  0,   1,   1,   0,   1,   1,],
        ['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   1,   0],
        ['C509.TCGA-78-7159-10A-01D-2036-08.1-C509.',  1,   0,   0,   1,   0,   2],]

dic = {}
for i in data:
    if not i[0] in dic: dic.update({i[0]: i[1::]})
    else: dic[i[0]] = list(map(add, dic[i[0]], i[1::]))

Это даст вам словарь с каждым уникальным первым значением и общей суммой других столбцов.

{'C509.TCGA-78-7159-10A-01D-2036-08.1-C509.': [3, 0, 0, 3, 1, 2],'C509.TCGA-78-7159-10A-01D-2036-08.1-C510.': [0, 1, 1, 0, 1, 1]}

...