2011-07-06 28 views
2

我有以下格式的製表符分隔數據的文本文件:如何平均文本文件中多列的列數據?

Depth Temp Salinity 
0.30 28.30 31.90 
0.30 28.30 31.90 
0.30 28.20 31.90 
0.30 28.20 31.90 
0.40 28.20 32.00 
0.40 28.00 32.00 
0.50 28.00 31.90 
0.60 28.00 32.00 
0.70 27.90 32.00 
0.60 27.90 32.10 

我想實現的是獲得那裏有在深度列重複值的所有行,並把它們放入一個列表/秒。然後從這個列表中我將平均每列的這些值(不是平均深度列),按深度對值進行排序,然後將所有這些輸出回原始數據文件格式。因此,在前面的示例文件,輸出會是:

Depth Temp Salinity 
0.30 28.25 31.90 
0.40 28.10 32.00 
0.50 28.00 31.90 
0.60 27.95 32.05 
0.70 27.90 32.00 

我明白我需要使用.readlines()來獲取相關線路,但我怎麼只搶重複行?

在此先感謝!

回答

1

你應該使用一個字典,其中的關鍵是深度。

lines = [ 
"0.30 28.30 31.90", 
"0.30 28.30 31.90", 
"0.30 28.20 31.90", 
"0.30 28.20 31.90", 
"0.40 28.20 32.00", 
"0.40 28.00 32.00", 
"0.50 28.00 31.90", 
"0.60 28.00 32.00", 
"0.70 27.90 32.00", 
"0.60 27.90 32.10" 
] 

dict = {} 
for line in lines: 
    depth, temp, salinity = map(float, line.split()) 
    old = (0,0,0) 
    if depth in dict: old = dict[depth] 
    dict[depth] = (old[0]+1, old[1]+temp, old[2]+salinity) 

for key in dict: 
    tri = dict[key] 
    print(str(key) +" "+str(tri[1]/tri[0])+" "+str(tri[2]/tri[0])) 
+0

這個效果很好!這個輸出是未排序的,我如何根據深度對它進行排序? – Luk45

+0

@ Luk45,'鍵排序(字典):'應該這樣做 –

+0

但你真的不應該使用字典作爲變量名稱 –

1

如果你能負擔得起整個文件讀入內存,itertools.groupby可以簡化代碼:

from itertools import groupby 

lines = [map(float, line.split("\t")) for line in open('file.txt')] 
print lines[0].strip() # print out header 
key_fun = lambda(x):x[0] 
sorted_lines = sorted(lines[1:], key=key_fun) 
for k,g in groupby(sorted_lines, key=key_fun): 
    g = list(g) 
    mean_temp = sum(x[1] for x in g)/len(g) 
    mean_salinity = sum(x[2] for x in g)/len(g) 
    print "%f\t%f\t%f" % (k,mean_temp,mean_salinity) 
+0

感謝您的解決方案和鏈接,看起來像我有一些閱讀要做! – Luk45

+0

你不需要使用列表理解的總和。 'sum(x [1] for x in g)'將會正常工作 –

+0

更改了代碼,謝謝。 –

0

使用numpy的可以簡化計算:

import numpy as np 
with file("data.txt", "rb") as f: 
    titles = f.readline().strip().split() 
    data = np.loadtxt(f) 
data = data[np.argsort(data[:, 0])] 
split_index = np.where(np.diff(data[:,0])>0)[0]+1 

print "\t".join(titles) 
for a in np.split(data, split_index): 
    print "\t".join("%f" % x for x in np.average(a, axis=0)) 
+0

感謝您的輸入@ user772649,我以前從未使用numpy,所以我必須測試此解決方案! – Luk45

相關問題