通过pandas坐标数据帧在单元格中查找点

时间:2014-12-13 22:38:10

标签: python pandas dataframe points spatial-query

我必须通过两个pandas数据帧找到哪些点位于方格单元网格中,给定点坐标和单元格边界的坐标。 我正在调用 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

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

可能是一种更好的方式,但因为这已经坐了一段时间..

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

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