将多个点连接到多边形并将列的连接点值连接到多边形列

时间:2018-03-19 01:07:29

标签: python pandas concatenation geospatial geopandas

我的数据:

Points:
    ID HN Street 
    1  5  Examplestreet
    2  6  Examplestreet
    3  2  Otherstreet
    4  2  Anotherstreet
Polygons:
    Name
    Firstpolygon
    Secondpolygon
    Otherpolygon  

所以我想要一个(多边形)到多个(点)空间连接,并将连接的valus从点HN列连接到Polygonsfile中的新列“all_HN”。

所以结果应该是这样的:

Name          all_HN
Firstpolygon  5,6   -> if the points ID1 and ID2 lie within the same polygon (`"Firstpolygon"`)
Secondpolygon 2     -> point ID3 within the `"Secondpolygon"`
Otherpolygon  NULL  -> no point within "Otherpolygon"
and so on

我想用geopandas来解决这个问题。 (我有大约200.000点和100.000多边形) 使用以下代码:

from geopandas import gpd

points = gpd.GeoDataFrame.from_file('MyPointsFile) # or geojson etc 
polys = gpd.GeoDataFrame.from_file('MyPolygonsFile.shp') 
pointInPoly = gpd.sjoin(points, polys, op='within',how='inner')

现在我想使用类似的东西:

pointInPoly.groupby('index_right')['HN_left'].sum()

但是,而不是sum()用于将匹配点的所有值汇总为新列“all_HN”的正确命令。

任何人,任何想法如何解决这个问题?它也可以使用另一个包而不是geopandas。 由于地理信息以大熊猫为基础,大熊猫解决方案也应该有效。 只需将匹配的所有列附加到相应的多边形表即可。

1 个答案:

答案 0 :(得分:0)

如果要将这些值分组而不是对它们求和,可以执行以下操作(使用不带几何的示例数据框,但merge而不是sjoin之后的结果应该类似):

In [53]: df1 = pd.DataFrame({'key': ['a', 'b', 'c'], 'index': [1, 2, 3]})

In [54]: df2 = pd.DataFrame({'key': ['a', 'a', 'b'], 'HN': [5, 6, 2]})

In [55]: res = pd.merge(df1, df2, how='left')

In [56]: res
Out[56]: 
   index key   HN
0      1   a  5.0
1      1   a  6.0
2      2   b  2.0
3      3   c  NaN

In [57]: res.groupby('index')['HN'].apply(list)
Out[57]: 
index
1    [5.0, 6.0]
2         [2.0]
3         [nan]
Name: HN, dtype: object

如果您不想要[nan],则可以调整传递给apply的函数。