2

我是 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 行。第一列中的值按升序排列。

谢谢,亚当

4

3 回答 3

3
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]))
于 2012-06-29T05:32:57.777 回答
1

这有效:

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 
于 2012-06-29T06:46:58.237 回答
0

对于这类工作,我强烈推荐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'])

df数据框现在包含您的示例数据:

df
Out[90]: 
         a   b   c   d   e
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]: 
         a   b   c   d   e
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
于 2015-05-31T12:09:40.610 回答