約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個のファイルがあります。 1つにマージし、重複したアイテムを削除しました。私がしたいのは、2つの線の緯度と経度が同じ場合に列の平均を計算する必要があるということです。たとえば、
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になります。これは、欠落しているデータが表示されるためです。
- 平均は、同じ経度と緯度ができるだけ多くの点について計算されます。座標が61.6と1.3の2つの点がある場合、変数(air_temp、sst、wind_speed、wave_height、およびwave_period)を含む行は1つだけです。平均計算。
ソースファイル:
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