通过坐标的熊猫数据框在单元格中查找点


问题内容

我必须通过两个熊猫数据框找到给定的点坐标和单元格边界的坐标,然后在正方形单元格的网格中找到哪些点。我将 dfc 称为包含代码和单元格边界坐标的数据
(我简化了问题,在实际分析中,我有一个带有地理点和大量要检查点的大网格):

Code,minx,miny,maxx,maxy
01,0.0,0.0,2.0,2.0
02,2.0,2.0,3.0,3.0

dfp 包含ID和点坐标的数据框:

Id,x,y
0,1.5,1.5
1,1.1,1.1
2,2.2,2.2
3,1.3,1.3
4,3.4,1.4
5,2.0,1.5

现在,我想执行一次搜索,以在dfc数据帧中返回该点所在的网格的新列(称为“ GridCode”)。像元应完美地平方,因此我想通过以下方式执行分析:

a = np.where(
            (dfp['x'] > dfc['minx']) &
            (dfp['x'] < dfc['maxx']) &
            (dfp['y'] > dfc['miny']) &
            (dfp['y'] < dfc['maxy']),
            r2['Code'],
            'na')

避免在数据帧上出现多个循环。数据帧的长度不同。结果数据帧应如下所示:

   Id    x    y GridCode
0   0  1.5  1.5   01
1   1  1.1  1.1   01
2   2  2.2  2.2   02
3   3  1.3  1.3   01
4   4  3.4  1.4   na
5   5  2.0  1.5   na

在此先感谢您的帮助!


问题答案:

可能是一种更好的方法,但是由于这种方法已经存在了一段时间。

使用Pandas布尔值索引而不是np.where()过滤dfc数据帧

def findGrid(dfp):  
    c = dfc[(dfp['x'] > dfc['minx']) &
            (dfp['x'] < dfc['maxx']) &
            (dfp['y'] > dfc['miny']) &
            (dfp['y'] < dfc['maxy'])].Code

    if len(c) == 0:        
        return None
    else:        
        return c.iat[0]

然后使用pandas apply()函数

dfp['GridCode'] = dfp.apply(findGrid,axis=1)

会产生这个

    Id  x   y   GridCode
0   0   1.5 1.5 1
1   1   1.1 1.1 1
2   2   2.2 2.2 2
3   3   1.3 1.3 1
4   4   3.4 1.4 NaN
5   5   2.0 1.5 NaN