2011-07-06 1 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列を平均化せずに)、値をDepthでソートし、すべてを元のデータファイル形式に戻します。関連する行をつかむために、どのように私は唯一の重複行をつかむん)私は.readlinesを(使用する必要があります理解し

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 

:だから、例の出力は以下のようになり、上記のファイル?

ありがとうございます!

答えて

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

!この出力はソートされていませんでしたが、どのようにDepthでソートするのですか? – Luk45

+0

@ Luk45、 'ソートされた(dict)のキー:'はそれを –

+0

とすべきですが、実際には変数名としてdictを使用すべきではありません。 –

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

関連する問題