![如何计算前两列具有相同值的多列的平均值?](https://linux22.com/image/116147/%E5%A6%82%E4%BD%95%E8%AE%A1%E7%AE%97%E5%89%8D%E4%B8%A4%E5%88%97%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E5%80%BC%E7%9A%84%E5%A4%9A%E5%88%97%E7%9A%84%E5%B9%B3%E5%9D%87%E5%80%BC%EF%BC%9F.png)
我有一个大约 1300 万行的文件,例如:
Lat Long air_temp sst wind_speed wave_height wave_period
65.3 7.3 4.3 8.8 7.7 4 8
61.6 1.3 -9.99 8.8 9.8 4 7
61.2 1.1 -9.99 8.8 7.7 3 7
61.1 1 -9.99 8.8 8.7 3.5 7
61 1.7 -9.99 8.8 10.8 4 7
60.6 1.7 -9.99 8.8 8.2 4 10
60.6 3.7 -9.99 8.8 8.2 3.5 8
60.6 -4.9 4.7 8.8 10.3 3.5 7
60.4 1.2 5.1 7 15 2 4
59.6 2.2 2.3 7.7 4.6 3.5 9
59.5 1.6 -9.99 7.7 3.6 4 8
我有 72 个包含所有这些变量的文件。我已将它们合并为一个,并删除了重复项。我要做的是,当两条线的纬度和经度相同时,我必须计算列的平均值。例如:
Lat Long air_temp sst wind_speed wave_height wave_period
61.1 1 -9.99 8.8 8.7 3.5 7
61.6 1.3 -9.99 8.8 9.8 4 7
61.6 1.3 3 8.6 7.7 3 7
65.3 7.3 4.3 8.8 7.7 4 8
65.3 7.3 2 4 5 2 10
输出文件将如下所示:
Lat Long air_temp sst wind_speed wave_height wave_period
61.1 1 -9.99 8.8 8.7 3.5 7
61.6 1.3 -9.99 8.7 8.75 3.5 7
65.3 7.3 3.15 6.4 6.35 3 9
因此:
- 如果air_temp=-9.99,计算出的“平均值”将为-9.99,因为这显示丢失的数据
- 平均值是在具有相同经度和纬度的尽可能多的点上计算的 - 如果有 2 个点的坐标为 61.6 和 1.3,则只有一行包含变量(air_temp、sst、wind_speed、wave_height 和 wave_period)按平均值计算。
原始文件:
Lat Long air_temp sst wind_speed wave_height wave_period
0 0.1 22.9 22.5 7.7 1 5
0 0.2 24 26 4.6 2 6
0 0 24.1 25.3 3 1.5 9
0 0 24.4 25.3 3 1.5 8
0 0 24.5 25.3 2 1.5 8
0 0 24.7 25.2 1 1.5 10
0 0 24.8 25.1 3 1.5 8
0 0 24.8 25.2 2 1.5 12
0 0 24.9 25.2 5 1.5 9
0 0 25.2 25.5 2 3.5 10
0 0 25 25.2 5 1.5 9
0 0 26.9 27.2 4 1.5 10
0 0 26.9 27.2 5 1.5 9
0 0 28.5 29.6 7.2 1.5 7
0 -0.2 -9.99 30.4 3.6 1.5 8
0 0.3 27 27 4.6 2 12
0 -0.3 27 27.5 5.7 1.5 8
0 0.4 23 23 8.2 1.5 3
0 0.5 24.6 25 10.3 2 6
0 0.6 26.7 27 5.1 1.5 10
0 -0.7 24 24.8 5.7 1 3
0 0.7 24 27 7.2 1.5 10
0 0.7 -9.99 28 6 1 8
0 0.8 27 28 7.2 1.5 9
我不知道为什么它没有完全排序(为什么前面有 0.1 和 0.2),但所需的输出是:
Lat Long air_temp sst wind_speed wave_height wave_period
0 0.1 22.9 22.5 7.7 1 5
0 0.2 24 26 4.6 2 6
0 0 25.3916666667 25.9416666667 3.5166666667 1.6666666667 9.0833333333
0 -0.2 -9.99 30.4 3.6 1.5 8
0 0.3 27 27 4.6 2 12
0 -0.3 27 27.5 5.7 1.5 8
0 0.4 23 23 8.2 1.5 3
0 0.5 24.6 25 10.3 2 6
0 0.6 26.7 27 5.1 1.5 10
0 -0.7 24 24.8 5.7 1 3
0 0.7 -9.99 27.5 6.6 1.25 9
0 0.8 27 28 7.2 1.5 9
答案1
这可以用 Python 来完成,如下所示:
代码:
#!/usr/bin/python
import re
import sys
SPACES = re.compile('\s+')
data_by_lat_long = {}
with open(sys.argv[1]) as f:
# get and print header
line = next(f)
print(line.strip())
for line in f:
data = SPACES.split(line.strip())
data_by_lat_long.setdefault((data[0], data[1]), []).append(data[2:])
for lat_long, data in data_by_lat_long.items():
results = zip(*data)
if '-9.99' in results[0]:
results[0] = ('-9.99', )
avg = tuple(str(sum(float(x) for x in d) / len(d)) for d in results)
print('\t'.join(lat_long + avg))
结果:
Lat Long air_temp sst wind_speed wave_height wave_period
65.3 7.3 3.15 6.4 6.35 3.0 9.0
61.1 1 -9.99 8.8 8.7 3.5 7.0
61.6 1.3 -9.99 8.7 8.75 3.5 7.0
和,
Lat Long air_temp sst wind_speed wave_height wave_period
0 -0.7 24.0 24.8 5.7 1.0 3.0
0 0.1 22.9 22.5 7.7 1.0 5.0
0 0.3 27.0 27.0 4.6 2.0 12.0
0 0.2 24.0 26.0 4.6 2.0 6.0
0 0.8 27.0 28.0 7.2 1.5 9.0
0 -0.3 27.0 27.5 5.7 1.5 8.0
0 0.5 24.6 25.0 10.3 2.0 6.0
0 -0.2 -9.99 30.4 3.6 1.5 8.0
0 0.4 23.0 23.0 8.2 1.5 3.0
0 0.7 -9.99 27.5 6.6 1.25 9.0
0 0 25.3916666667 25.9416666667 3.51666666667 1.66666666667 9.08333333333
0 0.6 26.7 27.0 5.1 1.5 10.0