Text-Processing
如何計算前兩列具有相同值的多列的平均值?
我有一個大約 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 個包含所有這些變數的文件。我已將它們合併為一個並刪除了重複項。我要做的是當 2 行的 lat 和 long 相同時,我必須計算列的平均值。例如:
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
這可以用 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