Как можно объединить две GeoDataFrame
с геометрией Point
и произвольными другими столбцами одновременно?Я понимаю, что эта задача неоднозначна для всех других геометрий, отличных от Point
, потому что "равенство" не совсем определено для линий и многоугольников, но все же.
Следующее MWE выдает ошибку, если я просто пытаюсь gdf2.merge(gdf)
,правильно жаловаться, что
не подлежащий обработке тип: 'Point'.
Как обойти это?
import geopandas as gpd
import pandas as pd
from io import StringIO
import shapely
df = pd.read_csv(StringIO('''
Name Value x y
'a' 1.5 0. 0.
'b' 22 0. 1.
'c' 0.2 0. 1.
'''),sep=r"\s*",engine='python')
df2 = pd.read_csv(StringIO('''
Name OtherValue x y
'a' 9.9 0. 0.
'b' 4.5 0. 1.
'c' 2e3 1. 1.
'''),sep=r"\s*",engine='python')
def dataframe_to_geodataframe(df):
geometry = [shapely.geometry.Point(xy) for xy in zip(df.x, df.y)]
df = df.drop(['x','y'], axis=1)
gdf = gpd.GeoDataFrame(df, geometry=geometry)
return gdf
gdf = dataframe_to_geodataframe(df)
gdf2 = dataframe_to_geodataframe(df2)
gdf.merge(gdf2,how='left')
В идеале вывод будет выглядеть примерно так:
Name Value geometry OtherValue
0 'a' 1.5 POINT (0 0) 9.9
1 'b' 22.0 POINT (0 1) 4.5
2 'c' 0.2 POINT (0 1) NaN
(конечно, в зависимости от ключевого слова how
).
(я понимаю, что это можно легко сделать после преобразования обратно в обычные панды DataFrames, но я считаю, чтоспособ сделать это без преобразования вперед и назад.)