【发布时间】:2020-09-23 20:58:45
【问题描述】:
我有以下数据框 -df :
crs Band1 level
lat lon
34.595694 32.929028 b'' 4.000000e+00 1000
32.937361 b'' 1.200000e+01 950
32.945694 b'' 2.900000e+01 925
34.604028 32.929028 b'' 7.000000e+00 1000
32.937361 b'' 1.300000e+01 950
... ... ...
71.179028 25.679028 b'' 6.000000e+01 750
71.187361 25.662361 b'' 1.000000e+00 725
25.670694 b'' 6.000000e+01 1000
25.679028 b'' 4.000000e+01 800
71.529028 19.387361 b'' 1.843913e-38 1000
[17671817 rows x 3 columns]
还有两个数组:
lon1=np.arange(-11,47,0.25)
lat1=np.arange(71.5,34.5,-0.25)
这两个数组(lat1,lon1)产生间隔为 0.25 度的坐标对。
数据框df 包含点(lat,lon),这些点在lon1 和lat1 数组定义的点内密集分布。我想做的是:
- 在
lat1,lon1定义的点的 0.125 度范围内查找(过滤)来自df的所有点 - 从此子数据框中获取
level的max和min值,并将它们存储在与lon1和lat1大小相同的单独数组中。
到目前为止我所做的是过滤数据框:
for x1 in lon1:
for y1 in lat1:
df3=df[(df.index.get_level_values('lon')>x1-0.125) & (df.index.get_level_values('lon')<x1+0.125)]
df3=df3[(df3.index.get_level_values('lat')>y1-0.125) & (df3.index.get_level_values('lat')<y1+0.125)]
但这性能很慢。我相信有一个更快的。 我也标记了 scikit-learn,因为可能可以用它来完成,但我缺乏这个包的经验。 任何帮助表示赞赏。
【问题讨论】:
-
lon1 和 lat1 是什么关系?是笛卡尔多派系(lat1 中的每个值都具有 lon1 的所有值)还是匹配索引? (lon1[0] 与 lat1[0],与索引 1 等相同)
-
lon1 和 lat1 是点的经度和纬度。 lon1[0], lat1[0] 用经纬度描述一个点。
-
也许this 有助于提高速度;显然对数据进行排序应该已经有所帮助
-
还有一个问题:你想要一个子数据帧,还是多个子数据帧(以 lon1 数组的大小),每个找到一个最大值和最小值?我的意思是,你想要范围内所有点的最大值和最小值,还是每对的 df 的最大值和最小值?
-
df1 快照的链接(30k 记录)。 :1drv.ms/u/s!Aj5DfuTWg1OMjtskbyjp5bR-Ga6tbg?e=Zfq5oZ
标签: python pandas scikit-learn