我的数据:
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。 由于地理信息以大熊猫为基础,大熊猫解决方案也应该有效。 只需将匹配的所有列附加到相应的多边形表即可。
答案 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
的函数。