pandas - 删除重复点
问题描述
我有两个geodataframes
或geoseries
,两个都包含数千个points
。
我的要求是追加(合并)两者geodataframes
并删除重复点。
换句话说,output = gdf1 all points + gdf2 points that do not intersect with gdf1 points
我试过:
output = geopandas.overlay(gdf1, gdf2, how='symmetric_difference')
但是,它非常缓慢。
你知道有什么更快的方法吗?
解决方案
这是另一种使用 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
推荐阅读
- python - 如何在 python 中使用 imshow 绘图时获取国家边界线
- git - Git,最安全的方式来重新开始并摆脱本地更改?
- header - Varnish - 生成 http 标头溢出
- c# - 将 WPF CheckBox.IsChecked 绑定到列表
- java - 根据条件从 Hibernate 中获取 ElementCollecion
- android - 为什么当我在适配器中添加数据时,它也会改变我的 LiveData?
- solr - 如何在 solr lucene 查询中应用 WHEN-CASE 或 if-else 条件
- python - Problem with many to many fieds in DRF create API
- r - R,更改数组中的元素列表中的内容
- java - Akka-HTTP 服务器 HTTPS 支持