如何将其转换为更多(更快!)Pythonic代码?

2024-09-30 18:34:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大约550000个数据点的数据块,其中包括经度和纬度。 现在我想确定在哪个区域块中包含该行中的点。共有六个区域块,彼此不重叠,我已将其编码为geopandas“几何体”,如下所示:

    TMA  ...                                           geometry
0  TMA1  ...  POLYGON ((5.33333 52.80556, 5.60944 52.50750, ...
1  TMA2  ...  POLYGON ((4.11806 52.90028, 4.35000 52.80528, ...
2  TMA3  ...  POLYGON ((5.07333 52.19583, 5.11944 52.20528, ...
3  TMA4  ...  POLYGON ((5.11944 52.20528, 5.41972 52.26556, ...
4  TMA5  ...  POLYGON ((5.41972 52.26556, 5.60944 52.30306, ...
5  TMA6  ...  POLYGON ((4.35000 52.80528, 4.46750 52.75694, ...

[6 rows x 4 columns]

为了用正确的面积(TMA)值填充数据帧,我编写了以下代码:

df1['point'] = gp.points_from_xy(df1['LON'],df1['LAT'])
df1['TMA'] = 99
for i in range(0, len(df1)):
    for j in range(0,6):
        if Schiphol_TMA['geometry'][j].contains(df1['point'][i]): 
            df1['TMA'][i] = j+1

然而,这需要大量的时间。 有没有一种更聪明的编码方法来加速这个过程? (是的,我读过“从不在数据帧上迭代”等)。编辑:也许列表理解可以在这里发挥作用,但是我太初学了,无法完全理解那里发生的事情


Tags: 数据in区域编码forrangepointdf1
2条回答

上述例程(包括break命令):

df1['TMA'] = 99
for i in range(0, len(df1)):
    for j in range(0,6):
        if Schiphol_TMA['geometry'][j].contains(df1['point'][i]): 
            df1['TMA'][i] = j+1
            break

以上时间为86.8秒(在Google Colab上)

当我使用列表理解重写以下代码时:

df1['point'] = gp.points_from_xy(df1['LON'],df1['LAT'])
def f(p):
    for T in range(0, 6):
        if Schiphol_TMA['geometry'][T].contains(p):
            result = T+1
            break
        else:
            result = 99  # not in any area
    return result
            
df1['TMA'] = [f(pt) for pt in df1['point']]

这个新的程序花了45.9秒。大约一半。 我开始学习。。。 也许这可以做得更快

又是我。我又发现了一个进步。 大部分点(330.000)位于6个区域之外。因此,我首先用以下方法创建6个区域的轮廓:

SPL_TMA_Contour = Schiphol_TMA.unary_union

然后修改例程以仅在点位于轮廓内时进行检查:

df1['point'] = gp.points_from_xy(df1['LON'],df1['LAT'])
def f(p):
    result = 99
    if SPL_TMA_Contour.contains(p):
        for T in range(0, 6):
            if Schiphol_TMA['geometry'][T].contains(p):
                result = T+1
                break
    return result
df1['TMA'] = [f(pt) for pt in df1['point']]

使用的时间现在减少到15.6秒!骄傲

相关问题 更多 >