Как усреднить данные столбца для нескольких столбцов в текстовых файлах? - PullRequest
2 голосов
/ 06 июля 2011

У меня есть текстовый файл данных с разделителями табуляции в следующем формате:

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 (), чтобы получить соответствующие строки, но как мне получить только повторяющиеся строки?

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Если вы можете позволить себе прочитать весь файл в память, 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)
1 голос
/ 06 июля 2011

Вы должны использовать словарь, где ключом является глубина.

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 голосов
/ 06 июля 2011

Использование 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))
...