Как объединить числовые столбчатые данные в Python?

Я начинаю на Python, и я понятия не имею, как сделать следующее:

У меня есть текстовый файл с числовыми данными в этой форме:

  
 1461,5 5 9 -18 32
 1462 21 5 -6 32
 1462 5 4 -23 32
 1462,5 17 6 ​​-7 30
 1464 11 6 -14 31
 1464 8 2 -22 32
 1464,5 9 5 -17 31
 1465 6 16 -7 29
 1467 9 6 -17 32
 1467,5 14 9 -8 31
 1469,5 13 5 -12 30
 1469,5 14 10 -7 31
 1471 15 7 -9 31
 1471 12 8 -10 30
 1471,5 13 11 -7 31
 1472 27 4 -1 32
 1472 7 13 -8 28
 1472 8 8 -14 30 

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

 1461,5 5 9 -18 32
 1462 26 9 -29 64
 1462,5 17 6 ​​-7 30
 1464 19 8 -36 63
 1464,5 9 5 -17 31
 1465 6 16 -7 29
 1467 9 6 -17 32
 1467,5 14 9 -8 31
 1469,5 27 15 -19 61
 1471 27 15 -19 61
 1471,5 13 11 -7 31
 1472 42 25 -23 90 

Если это сделает вещи менее сложными, все числа в первом столбце могут быть округлены до целых чисел заблаговременно (это мало повлияет на последующие вычисления).

Примечание. Фактический текстовый файл содержит 23 000 строк. Значения в первом столбце находятся в порядке возрастания.

Спасибо, Адам

from collections import defaultdict D = defaultdict(list) with open("data.txt") as f: for row in f: row = row.split() D[float(row[0])].append([int(x) for x in row[1:]]) for k,v in sorted(D.items()): print k, [sum(x) for x in zip(*v)] 

Изменить: поскольку входной файл всегда в порядке, вы можете сделать лучше

 from itertools import groupby with open("data.txt") as f: for k,v in groupby(f, key=lambda x:x.split()[0]): print k, map(sum, zip(*[map(int, x.split()[1:]) for x in v])) 

Это работает:

 with open('data.txt') as data: d={} for row in data: l=row.split() key=l[0] l=[int(e) for e in l[1:]] if key in d: d[key]=[x+y for x,y in zip(l,d[key])] else: d[key]=l for e in sorted(d.keys()): t=tuple([e]+list(map(str,d[e]))) print("{:<7} {:<3} {:<3} {:<3} {:<3}".format(*t)) 

Печать:

 1461.5 5 9 -18 32 1462 26 9 -29 64 1462.5 17 6 -7 30 1464 19 8 -36 63 1464.5 9 5 -17 31 1465 6 16 -7 29 1467 9 6 -17 32 1467.5 14 9 -8 31 1469.5 27 15 -19 61 1471 27 15 -19 61 1471.5 13 11 -7 31 1472 42 25 -23 90 

Я очень рекомендую пакет pandas для такого рода работ.

Загрузить данные:

 import io import pandas as pd data = """ 1461.5 5 9 -18 32 1462 21 5 -6 32 1462 5 4 -23 32 1462.5 17 6 -7 30 1464 11 6 -14 31 1464 8 2 -22 32 1464.5 9 5 -17 31 1465 6 16 -7 29 1467 9 6 -17 32 1467.5 14 9 -8 31 1469.5 13 5 -12 30 1469.5 14 10 -7 31 1471 15 7 -9 31 1471 12 8 -10 30 1471.5 13 11 -7 31 1472 27 4 -1 32 1472 7 13 -8 28 1472 8 8 -14 30 """ df = pd.read_csv(io.StringIO(data), sep=' *', engine='python', names=['a', 'b', 'c', 'd', 'e']) 

В DataFrame df теперь содержатся данные вашего примера:

 df Out[90]: abcde 0 1461.5 5 9 -18 32 1 1462.0 21 5 -6 32 2 1462.0 5 4 -23 32 3 1462.5 17 6 -7 30 4 1464.0 11 6 -14 31 5 1464.0 8 2 -22 32 6 1464.5 9 5 -17 31 7 1465.0 6 16 -7 29 8 1467.0 9 6 -17 32 9 1467.5 14 9 -8 31 10 1469.5 13 5 -12 30 11 1469.5 14 10 -7 31 12 1471.0 15 7 -9 31 13 1471.0 12 8 -10 30 14 1471.5 13 11 -7 31 15 1472.0 27 4 -1 32 16 1472.0 7 13 -8 28 17 1472.0 8 8 -14 30 

Группировка этого фрейма данных по первому столбцу и суммирование всех остальных столбцов – это всего лишь одна строка:

 df2 = df.groupby('a').agg(sum).reset_index() df2 Out[92]: abcde 0 1461.5 5 9 -18 32 1 1462.0 26 9 -29 64 2 1462.5 17 6 -7 30 3 1464.0 19 8 -36 63 4 1464.5 9 5 -17 31 5 1465.0 6 16 -7 29 6 1467.0 9 6 -17 32 7 1467.5 14 9 -8 31 8 1469.5 27 15 -19 61 9 1471.0 27 15 -19 61 10 1471.5 13 11 -7 31 11 1472.0 42 25 -23 90