首页 > 解决方案 > 删除重复点

问题描述

我有两个geodataframesgeoseries,两个都包含数千个points

我的要求是追加(合并)两者geodataframes并删除重复点。

换句话说,output = gdf1 all points + gdf2 points that do not intersect with gdf1 points

我试过:

output = geopandas.overlay(gdf1, gdf2, how='symmetric_difference')

但是,它非常缓慢。

你知道有什么更快的方法吗?

标签: pandasgeopandasshapely

解决方案


这是另一种使用 pandas 组合数据帧的方法,以及时间,与 geopandas:

import pandas as pd
import numpy as np

data1 = np.random.randint(-100, 100, size=10000)
data2 = np.random.randint(-100, 100, size=10000)

df1 = pd.concat([-pd.Series(data1, name="longitude"), pd.Series(data1, name="latitude")], axis=1)
df1['geometry'] = df1.apply(lambda x: (x['latitude'], x['longitude']), axis=1)

df2 = pd.concat([-pd.Series(data2, name="longitude"), pd.Series(data2, name="latitude")], axis=1)
df2['geometry'] = df2.apply(lambda x: (x['latitude'], x['longitude']), axis=1)

df1 = df1.set_index(["longitude", "latitude"])
df2 = df2.set_index(["longitude", "latitude"])

%timeit pd.concat([df1[~df1.index.isin(df2.index)],df2[~df2.index.isin(df1.index)]])
    
112 ms ± 217 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

这似乎比使用 geopandas 快得多

import geopandas as gp

gdf1 = gp.GeoDataFrame(
    df1, geometry=gp.points_from_xy(df1.index.get_level_values("longitude"), df1.index.get_level_values("latitude")))
gdf2 = gp.GeoDataFrame(
    df2, geometry=gp.points_from_xy(df2.index.get_level_values("longitude"), df2.index.get_level_values("latitude")))

%timeit gp.overlay(gdf1, gdf2, how='symmetric_difference')

29 s ± 317 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

但也许您需要此处提到的某种优化。

该函数检查每个 df 中的不匹配索引,然后将它们组合起来。

df1 = pd.DataFrame([1,2,3,4],columns=['col1']).set_index("col1")
df2 = pd.DataFrame([3,4,5,6],columns=['col1']).set_index("col1")
pd.concat([df1[~df1.index.isin(df2.index)],df2[~df2.index.isin(df1.index)]])

col1
1
2
5
6

推荐阅读