如何对文本文件中多个列的数据求平均值?

2 投票
3 回答
1236 浏览
提问于 2025-04-16 20:55

我有一个用制表符分隔的数据文本文件,格式如下:

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”这一列)进行平均计算,按照“Depth”列的值进行排序,最后把这些结果输出回原来的数据文件格式。所以在上面的例子中,输出结果会是:

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 个回答

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

撰写回答