Answers:
首先将DataFrame的内容(例如Lat
和Lon
列)转换为适当的Shapely几何形状,然后将它们与原始DataFrame一起使用以创建GeoDataFrame。
from geopandas import GeoDataFrame
from shapely.geometry import Point
geometry = [Point(xy) for xy in zip(df.Lon, df.Lat)]
df = df.drop(['Lon', 'Lat'], axis=1)
crs = {'init': 'epsg:4326'}
gdf = GeoDataFrame(df, crs=crs, geometry=geometry)
结果:
Date/Time ID geometry
0 4/1/2014 0:11:00 140 POINT (-73.95489999999999 40.769)
1 4/1/2014 0:17:00 NaN POINT (-74.03449999999999 40.7267)
由于几何图形通常采用WKT格式,因此我认为我也将针对这种情况提供一个示例:
import geopandas as gpd
import shapely.wkt
geometry = df['wktcolumn'].map(shapely.wkt.loads)
df = df.drop('wktcolumn', axis=1)
crs = {'init': 'epsg:4326'}
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)
一线!再加上一些针对大数据人员的性能指标。
给定一个pandas.DataFrame
具有x经度和y纬度的,如下所示:
df.head()
x y
0 229.617902 -73.133816
1 229.611157 -73.141299
2 229.609825 -73.142795
3 229.607159 -73.145782
4 229.605825 -73.147274
让我们将转换pandas.DataFrame
为geopandas.GeoDataFrame
,如下所示:
库的导入和匀称的加速:
import geopandas as gpd
import shapely
shapely.speedups.enable() # enabled by default from version 1.6.0
我躺在测试数据集上的代码+基准时间:
#Martin's original version:
#%timeit 1.87 s ± 7.03 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
gdf = gpd.GeoDataFrame(df.drop(['x', 'y'], axis=1),
crs={'init': 'epsg:4326'},
geometry=[shapely.geometry.Point(xy) for xy in zip(df.x, df.y)])
#Pandas apply method
#%timeit 8.59 s ± 60.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
gdf = gpd.GeoDataFrame(df.drop(['x', 'y'], axis=1),
crs={'init': 'epsg:4326'},
geometry=df.apply(lambda row: shapely.geometry.Point((row.x, row.y)), axis=1))
使用pandas.apply
的速度出奇地慢,但可能更适合其他一些工作流程(例如,在使用dask库的较大数据集上):
学分给:
一些处理大型dask
数据集的在进行中参考(截至2017年):