我有一个度量GeoDataframeX。每个度量都有一个位置,不一定是唯一的。 我得到一个结果GeoDataframeY。其几何图形的每个点都是唯一的,并根据需要进行间隔。 X的格式如下:
geometry measurement
timestamp
126 POINT (x1 y1) 0.558624
1133 POINT (x2 y2) 0.188086
1953 POINT (x3 y3) 1.206570
3147 POINT (x4 y4) 2.327880
4154 POINT (x5 y5) 1.603011
Y看起来像这样:
geometry value
id
0 POINT (x'1 y'1) NaN
1 POINT (x'2 y'2) NaN
2 POINT (x'3 y'3) NaN
3 POINT (x'4 y'4) NaN
4 POINT (x'5 y'5) NaN
我想汇总Y中X的度量,如下所示: 对于Y的每个点,取特定半径内X的所有值的平均值。
到目前为止,这是我想出的:
Y['value'] = Y.geometry.apply(lambda point: X.loc[X.geometry.distance(point) < radius, 'measurement'].mean())
几何具有高度,但是让我们忘记这个问题。
此代码可以正常工作,但是对于大型数据集,由于涉及隐藏的for循环,因此执行时间非常长。
我该如何优化? scipy.spatial.distance.cdist()看起来可能会有所帮助,但到目前为止,我在使用它时遇到了麻烦。
答案 0 :(得分:0)
对于寻求答案的人们,我设法做到了。
代码如下:
import geopandas as gpd
import pandas as pd
import numpy as np
from scipy.spatial import distance
@property
def x(self):
return pd.Series(self.geometry.apply(lambda p: p.x), name='x')
@property
def y(self):
return pd.Series(self.geometry.apply(lambda p: p.y), name='y')
@property
def z(self):
return pd.Series(self.geometry.apply(lambda p: p.z), name='z')
gpd.GeoDataFrame.x = x
gpd.GeoDataFrame.y = y
gpd.GeoDataFrame.z = z
Y_geometry_tuple = (Y.x, Y.y, Y.z)
X_geometry_tuple = (X.x, X.y, X.z)
dist_matrix = distance.cdist(np.atleast_2d(Y_geometry_tuple).T, np.atleast_2d(X_geometry_tuple).T) < radius
meas_matrix = dist_matrix * np.atleast_2d(X['measurement'])
meas_matrix[meas_matrix == 0] = np.nan
Y['value'] = np.nanmean(meas_matrix, 1)
计算速度大大提高(快了300-400倍)。