8 tips using GeoPandas and Python for Geospatial People

GeoPandas is great. If you are learning Geospatial Programming and work with vector data then you could do alot worse than giving GeoPandas a go. I’ve written a little about GeoPandas before; so first a couple of links.

Installing a Python Geospatial work environment that includes GeoPandas:

Python for Geospatial work flows part 1: Use anaconda

And if you want a simple guide to plotting then have a look here

Using GeoPandas to display Shapefiles in Jupyter Notebooks

In this post I have written 8 tips & tricks to downloading and manipulating a Shapefile using GeoPandas. These are the topics covered – more detail in the Notebook here

1. Downloading data and extracting it

import requests, zipfile, io ## Python imports

# set the url to the data
url = 'https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip'

# Use requests to download that url and zipfile to extract it
r = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(r.content))

2. Loading and plotting in GeoPandas

import geopandas as gpd shape_data = “ne_50m_admin_0_countries.shp” # refer to z.namelist() gdf = gpd.read_file(shape_data) gdf.plot()

Or 1 and 2 combined! Or you can read directly into geopandas from a URL. Thanks to @James_O_Connor1

gdf = gpd.GeoDataFrame.from_file('https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip')

3. Removing columns (in this case NAME_ZH or all columns with NAME in)

gdf.drop('NAME_ZH', axis=1, inplace=True)
## or
gdf.drop(list(gdf.filter(regex = 'NAME')), axis = 1, inplace = True)

4. Renaning columns (change AMDIN to C_Name)

gdf.rename(columns={"ADMIN": "C_Name"}, inplace=True)

5. Changing a column’s datatype (change MIN_ZOOM to an integer)

gdf = gdf.astype({'MIN_ZOOM': 'int32'})

6. Parsing an attribute query (country name = Belgium)

gdf_Bel = gdf.loc[gdf['C_Name'] == 'Belgium']

7. Converting a Pandas object (Dataframe) to a GeoPandas object (Dataframe)

projection = {'init': 'epsg:4326'}

gdf_Bel = gpd.GeoDataFrame(gdf_Bel, crs = projection, geometry = 'geometry')

8. Saving your work


For more context all the code with more detailed comments is in a easy to use Juypter Notebook here


I run training courses in the UK please do check out my training page for a Geospatial Python course near you. Or contact me for any training need on info@acgeospatial.co.uk – I’d be happy to help.

I am a freelancer able to help you with your projects. I offer consultancy, training and writing. I’d be delighted to hear from you. Please check out the books I have written on QGIS 3.4



I am @map_andrew on twitter


Image credit https://unsplash.com/photos/pZQQ_UyphtA