약 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가 됩니다. 이는 누락된 데이터를 표시하기 때문입니다.
- 평균은 경도와 위도가 동일한 가능한 한 많은 지점에 대해 계산됩니다. 좌표가 61.6과 1.3인 지점이 2개 있는 경우 변수(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