如何在Python中组合数值柱状数据?

时间:2012-06-29 05:01:05

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

谢谢, 亚当

3 个答案:

答案 0 :(得分: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]))

答案 1 :(得分: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 

答案 2 :(得分: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