@xhlu… you are my hero 
Thank you so much. Your work-around has done the trick!
I now have a custom multi-value tooltip for a Geojson polygon extrusion! I haven’t dared look into formatting but you know, I can live without d3 level number formatting for now.
To any others that want to try this kind of chart (pydeck polygon layer, pydeck geojson layer) I can share a few workarounds I’ve done to get it working using a json feature collection (with geometry) and no dataframe input.
Colouring individual features with dash-deck "GeoJsonLayer"
This has a few quirky parse issues. I got it working trial and error to colour individual features, with some pain. I’ll quickly explain.
First, from the dash deck demo, this looks like:
geojson = pydeck.Layer(
“GeoJsonLayer”,
DATA_URL,
opacity=0.8,
stroked=False,
filled=True,
extruded=True,
wireframe=True,
get_elevation=“properties.valuePerSqm / 20”,
get_fill_color="[255, 255, properties.growth * 255]",
get_line_color=[255, 255, 255],
)
The get_fill_color is what you want. Now you can set the RGB values manually to something like:
get_fill_color=[255, 255, 255]
But of course this will colour ALL your features the same. If you want to distinguish them, if you look at the example, it’s actually all in text, with a json property in there, indicating you can manipulate the RGB values for the parser.
get_fill_color="[255, 255, properties.growth * 255]"
Note this is a string. In the case of the dash deck demo (above) this does work, and the properties.growth value is parsed for every feature, but in every case it pushes the 255 value up out of range, which results in the actual colour output [255,255,0] actually displayed. Now at this point you might think (as I did): sweet as, I’ll just construct a nicely formatted string of RGB values as a custom property for each feature. i.e.
in the feature collection: properties.color = “[123,123,123]”
in the pydeck layer def: get_fill_color=“properties.color”
Didn’t work. I then tried returning an invidual string for each RGB in the string hoping it would be parsed like:
get_fill_color="[properties.red, properties.green, properties.blue]"
I was sure this would work. It didn’t. The parser is particular and YOU MUST multiply each json feature property value by a number inside the string. So I solved it with this:
get_fill_color="[properties.red*1, properties.green*1, properties.blue*1]"
Tooltip
Just to share how I got this working with help from @xhlu. Yes all you need to do is add new key/value pairs to your geojson feature collection at the feature level. i.e pull any properties key/values you need up one level.
for i in range(0, len(gj[‘features’])):
gj[‘features’][i][‘my-new-key’] = blah
Then you can reference the keys directly in the DeckGL initialisation code block, and this should magically work for all your features by returning the associated value for that key 
dash_deck.DeckGL(r.to_json(),
id=“deck-gl”,
mapboxKey=r.mapbox_key,
#style={“background-color”: ‘#b0dff7’},
#tooltip=True,
tooltip={“text”: “{my-new-key}” },
)
Cheers
Dan