I wrote a Python script who calculate, for rasters, mean value for each polygon of a shapefile. But I think that it's a "war machine" (it takes many treatment time) and I would like to simplify it.

Is somebody know a simple way to do it?

I'm using geopandas for shapefile manipulations.

1 Answer 1


You can use the rasterstats package for this.

For example (assuming you have a geopandas.GeoDataFrame called gdf):

from rasterstats import zonal_stats

with rasterio.open("/path/to/raster.tif") as src:
    affine = src.transform
    array = src.read(1)
    df_zonal_stats = pd.DataFrame(zonal_stats(gdf, array, affine=affine))

# adding statistics back to original GeoDataFrame
gdf2 = pd.concat([gdf, df_zonal_stats], axis=1) 
  • It works perfectly! but I forgot that I want always more :D and I would like to have 2 more value: 5 and 95 percentiles... apparently it isn't possible.
    – Tim C.
    Commented Sep 26, 2018 at 15:12
  • 3
    You can pass custom defined functions, see pythonhosted.org/rasterstats/…
    – joris
    Commented Sep 26, 2018 at 19:07
  • Awesome, all I need !
    – Tim C.
    Commented Sep 27, 2018 at 6:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.