2012-06-29 19 views
2

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

感謝, 亞當

+0

檢查出來... http://stackoverflow.com/questions/11239815/to-sum-column- with-condition/11239899#comment14768205_11239899 – avasal

+0

謝謝avasal。我將研究這個問題的答案。 –

回答

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])) 
+0

我從未注意過groupby函數,謝謝! –

+0

非常感謝。它的作品,它給了我一些東西來學習。我有點跟隨第一個例子中發生的事情。 –

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 
+0

謝謝。這對我來說很有意義(我是一名初學者)。 –

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