我必须通过两个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
提前感谢您的帮助!
答案 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