I'm trying to make a Folium Choropleth map. But I'm stuck for long time on completing it. My map shows boundaries correctly, even shows legend correctly but the map is not filled with choropleth colors.

I'm running my code on Jupyter Notebook. I have combined the geopandas dataframe and pandas dataframe as df_mergeplz

My simple code is

plzchoromap = folium.Map(location = [50.935173,6.953101],tiles='cartodbpositron',zoom_start = 11)

                       data = df_mergeplz,
                       columns=["Postal Code","Population"],
                       fill_opacity = 0.3,

my JSON file looks like

 "displayFieldName": "NUMMER",
 "fieldAliases": {"OBJECTID": "OBJECTID","NUMMER": "Postzustellbezirk (Nr.)"},
 "geometryType": "esriGeometryPolygon",
 "spatialReference": {"wkid": 4326,"latestWkid": 4326},
 "fields": [
      {"name": "OBJECTID","type": "esriFieldTypeOID","alias": "OBJECTID"},
      {"name": "NUMMER","type": "esriFieldTypeString","alias": "Postzustellbezirk (Nr.)","length": 5}
 "features": [
      {"attributes": {"OBJECTID": 16,"NUMMER": "51065"},
      "geometry": {"rings": [[[7.0088577711265421,50.964379468107985],,,....,]]}
      {"attributes": {"OBJECTID": 18,"NUMMER": "50823"},
      "geometry": {"rings": [[[6.9339208198918785,50.96181483933605],,,....,]]}

I want to use the parameter NUMMER inside features.attributes.NUMMER. But passing features.attributes.NUMMER throws error that

~/opt/anaconda3/envs/ML1env/lib/python3.8/site-packages/folium/folium.py in get_by_key(obj, key)
    285             def get_by_key(obj, key):
    286                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
--> 287                         get_by_key(obj.get(key.split('.')[0], None),
    288                                    '.'.join(key.split('.')[1:])))

~/opt/anaconda3/envs/ML1env/lib/python3.8/site-packages/folium/folium.py in get_by_key(obj, key)
    285             def get_by_key(obj, key):
--> 286                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
    287                         get_by_key(obj.get(key.split('.')[0], None),
    288                                    '.'.join(key.split('.')[1:])))

AttributeError: 'NoneType' object has no attribute 'get'

I have referred several other posts which primarily showed correction on key_on parameter. I doubt I am missing something obvious here. Summary:

key_on = feature.NUMMER #outputs unfilled folium map
key_on = feature.attributes.NUMMER #throws error.

Can someone please let me know what is the right key_on parameter for me or a guide on how to play with JSON object to find the correct key_on parameter.

Just to add on my df_mergeplz looks like below:

OBJECTID    NUMMER  geometry    minx    miny    maxx    maxy    Unnamed: 0  Postal Code City    Administrative Region   Population  Area    Area Codes  Neighborhoods   Latitude    Longitude
0   1   50769   POLYGON ((6.84866 51.08444, 6.84873 51.08420, ...   6.772530    51.007784   6.973939    51.084964   15  50769   Cologne North Rhine-Westphalia  63970   44.800  2203, 221   Chorweiler  51.046949   6.877612
  • The trick that worked for me is to load the json file into geopandas which works fine and then save it gdf.to_file('filename.json',driver='GeoJSON'). Now im able to access the key_on with feature.properties.NUMMER. So my guess is that my geoJSON file is different from standard. Not sure. But would love to understand what are the different formats of GeoJSON files. Thanks Mar 28, 2021 at 1:27

1 Answer 1


There is a type mismatch between the data you have a key on. I encountered the same issue and got it fixed now. Before passing your NUMMER, convert it to the string and pass the new column to choropleth:

df_mergeplz["NUMMERtxt"] = df_mergeplz["NUMMER"].astype(str)

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.