super 用户,
我有一个多索引数据框,如下所示:
DATA
DATETIME PLATFORM OBTYPE LONGITUDE LATITUDE PRESSURE
2014-12-01 GPSRO ba 164.87 -16.22 0.2086 -1.080487
-99.87 51.67 433.9650 9.404006
-99.84 51.66 447.1593 8.621209
-99.82 51.65 460.5582 9.060276
-99.78 51.63 474.2856 4.033578
-99.75 51.62 488.2451 -3.564176
-99.72 51.61 502.6438 2.418914
-99.71 51.60 517.6590 9.504872
-99.68 51.59 533.0165 2.074352
-99.63 51.57 548.5572 1.692488
-99.61 51.56 564.5204 1.287064
-99.58 51.55 581.1121 2.060976
... ...
-98.81 51.25 885.3300 1.078527
-98.79 51.24 911.0555 -6.613088
-98.66 51.20 936.2419 4.369489
-98.61 51.18 962.0027 4.806168
-98.60 51.17 989.4301 -9.383631
LATITUDE 列的值介于 -90 到 +90 之间 LONGITUDE 列的值介于 0 到 360 之间 DATA列是观测经纬度处的观测值
我想创建一个新的 DataFrame,其中包含 DATA 的 1 度 x 1 度框平均值 新的 DataFrame 将如下所示:
DATA
DATETIME PLATFORM OBTYPE LONGITUDE LATITUDE PRESSURE
2014-12-01 GPSRO ba 0.0 -89.50 0.2086 -1.080487
-88.50 474.2856 4.033578
-87.50 488.2451 -3.564176
... ...
1.0 -89.50 0.2086 -1.080487
-88.50 474.2856 4.033578
-87.50 488.2451 -3.564176
... ...
依此类推。
在 pandas 中执行此操作的最佳且有效的方法是什么?
谢谢
最佳答案
您需要执行几个步骤才能做到这一点:
- 创建您的垃圾箱,这里我使用
np.floor
函数,因为它可以满足您的需求并让事情变得简单。还具有矢量化的优点,因此性能应该不错且稳定。 - 通过取平均值来汇总这些数据箱。为此,
pandas
具有很好的groupby
函数( docs 和 more on the subject )。
这是我要做的(免责声明:我还没有测试过它,所以可能需要一些调整):
import numpy as np
no_index_df = df.reset_index()
no_index_df['LONGITUDE'] = no_index_df['LONGITUDE'].apply(lambda x: [e for e in range(0, 361, longitude_bin) if e <= x][-1])
no_index_df['LATITUDE'] = no_index_df['LATITUDE'].apply(lambda x: [e for e in range(-90, 91, latitude_bin) if e <= x][-1])
avg_data = no_index_data.groupby(
['DATETIME', 'PLATFORM', 'OBTYPE', 'LONGITUDE', 'LATITUDE', 'PRESSURE']
).mean()
此方法的唯一问题是,由于 'PRESSURE'
上的聚合,同一(经度,纬度)
对可能有多个行。您可以将其从 groupby
列表中取出,它也会被平均。
编辑:我更改了步骤 1(创建垃圾箱)以允许您使用任何间隔。
关于python - 用 pandas 平均二维地理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36970615/