Pandas 获取长方体区域内点的区域id(如果长方体包含点,则获取长方体id)

Pandas 获取长方体区域内点的区域id(如果长方体包含点,则获取长方体id),pandas,coordinates,Pandas,Coordinates,请帮我加速我的代码 有一个点有两个坐标(数据帧df1)。df2中的行使用左下角点和右上角点的坐标设置框区域,每个框都有一个区域id。对于来自df1的每一行(=具有2个坐标的点),我希望从数据帧df2获取区域id。我的代码是: def zone_map(df1, df2): df2['zone_id'] = df2.index for t ,t2 in df2.iterrows(): mask=(df1['lat'] >=df2.loc[t,'lat_bl'

请帮我加速我的代码
有一个点有两个坐标(数据帧df1)。df2中的行使用左下角点和右上角点的坐标设置框区域,每个框都有一个区域id。对于来自df1的每一行(=具有2个坐标的点),我希望从数据帧df2获取区域id。我的代码是:

def zone_map(df1, df2):
    df2['zone_id'] = df2.index

    for t ,t2 in df2.iterrows():
        mask=(df1['lat'] >=df2.loc[t,'lat_bl']) 
              & (df1['lat'] <df2.loc[t,'lat_tr']) 
              & (df1['lon'] >=df2.loc[t,'lon_bl'])
              & (df1['lon'] <df2.loc[t,'lon_tr'])
        for col in ['zone_id', 'lat_bl', 'lon_bl', 'lat_tr', 'lon_tr']:
             df1.loc[mask, col] = df2.loc[t,col]

    return df1

df_nodes=zone_map(df, df_zones)
谢谢大家!

内部循环:

for col in ['zone_id', 'lat_bl', 'lon_bl', 'lat_tr', 'lon_tr']:
    df1.loc[mask, col] = df2.loc[t,col]
可以这样替换:

# put this line before the first loop 
cols = ['zone_id', 'lat_bl', 'lon_bl', 'lat_tr', 'lon_tr']

# ...

df1.loc[mask, cols] = df2.loc[t, cols]

我会考虑使用这样的任务…

< P>使用:

为我们提供了以下GeoPandas DFs:

In [119]: z
Out[119]:
            zone_id                                           geometry
index_left
0                 0        POLYGON ((0 0, 0 0.1, 0.1 0.1, 0.1 0, 0 0))
1                 1  POLYGON ((0.1 0.1, 0.1 0.2, 0.2 0.2, 0.2 0.1, ...
2                 2  POLYGON ((0 0.1, 0 0.2, 0.1 0.2, 0.1 0.1, 0 0.1))
3                 3  POLYGON ((0.1 0, 0.1 0.1, 0.2 0.1, 0.2 0, 0.1 0))

In [120]: p
Out[120]:
            geometry
0    POINT (0.3 0.3)
1  POINT (0.05 0.05)
2  POINT (0.11 0.05)
现在我们可以使用空间连接:

In [121]: gpd.sjoin(p, z, how='left')
Out[121]:
            geometry  index_right  zone_id
0    POINT (0.3 0.3)          NaN      NaN
1  POINT (0.05 0.05)          0.0      0.0
2  POINT (0.11 0.05)          3.0      3.0

在这种情况下,我得到一个错误:“一个值试图设置在一个数据文件的一个切片的副本上。尝试使用.LOC[RoWixDexxor,CalthIxxel] =值”@ Yury,你能在你的问题和你想要的数据集中提供小的可重复的样本数据集吗?我增加了框架,如果你认为它已经回答了你的问题,请考虑一个答案。
In [119]: z
Out[119]:
            zone_id                                           geometry
index_left
0                 0        POLYGON ((0 0, 0 0.1, 0.1 0.1, 0.1 0, 0 0))
1                 1  POLYGON ((0.1 0.1, 0.1 0.2, 0.2 0.2, 0.2 0.1, ...
2                 2  POLYGON ((0 0.1, 0 0.2, 0.1 0.2, 0.1 0.1, 0 0.1))
3                 3  POLYGON ((0.1 0, 0.1 0.1, 0.2 0.1, 0.2 0, 0.1 0))

In [120]: p
Out[120]:
            geometry
0    POINT (0.3 0.3)
1  POINT (0.05 0.05)
2  POINT (0.11 0.05)
In [121]: gpd.sjoin(p, z, how='left')
Out[121]:
            geometry  index_right  zone_id
0    POINT (0.3 0.3)          NaN      NaN
1  POINT (0.05 0.05)          0.0      0.0
2  POINT (0.11 0.05)          3.0      3.0