我在pandas数据框中有一个坐标列表,并希望将每个坐标分配给一个区域。但是,现在我没有映射出不同的区域。我的目标是将给定区域划分为网格,网格的每个方格都作为自己的唯一区域。最后,根据我的坐标,我想计算每个区域内有多少个点。有人知道在python中解决这个问题的最佳方法吗?
lat = df.Latitude.values
lon = df.Longitude.values
coords = zip(lat, lon)
答案 0 :(得分:0)
一种选择是使用返回True
的函数实现此映射,如果x,y对位于所述区域内,则False
。使用pandas,可以轻松实现此功能。下面是一些这些函数的例子(三角函数归功于How to determine if a point is in a 2D triangle?):
def triangle(x,y,verts):
p0x,p0y = verts[0]; p1x,p1y = verts[1]; p2x,p2y = verts[2];
area = 0.5 *(-p1y*p2x + p0y*(-p1x + p2x) + p0x*(p1y - p2y) + p1x*p2y);
s = 1/(2*area)*(p0y*p2x - p0x*p2y + (p2y - p0y)*x + (p0x - p2x)*y);
t = 1/(2*area)*(p0x*p1y - p0y*p1x + (p0y - p1y)*x + (p1x - p0x)*y);
return (s>0) & (t>0) & (1-s-t>0)
def upper_square(x,y):
return (x>4) & (y>4)
def circle(x,y):
return ((x-2)**2+(y-2)**2)<1
然后,您可以遍历每个区域,以便将值分配给新列。使用上述函数的一个示例是使用dict将区域函数映射到区域id:
# define data
df = pd.DataFrame(np.random.random((10000,2))*5,columns=['lat','lon'])
t1 = ((0,0),(0,3),(1,0))
t2 = ((4,4),(4,2),(2,4))
# define relation between zone id and zone function
zones = {1:upper_square,2:lambda x,y: triangle(x,y,t1),3:lambda x,y: triangle(x,y,t2),4:circle}
df['zone']=0 # this will serve as everything else zone
# loop over zones and update df.zone column
for zone,zone_fun in zones.items():
mask = zone_fun(df.lat,df.lon)
df.loc[mask,'zone'] = zone
在这里,我们有5个区域,一个正方形,两个三角形,一个圆圈和其他所有东西。我们可以使用下面的图检查分配是否有效,它将根据df.zone
值绘制具有不同颜色的点:
plt.scatter(df.lat,df.lon,c = df.zone,s=10,cmap='plasma')
plt.gca().set_aspect('equal')
哪个收益率: