You dont specify how you want to interpolate.
This buffers the grey polygons and use the surrounding polygons values to calculate the average, with the intersection areas as weights.
So a polygon with a long shared border with your grey polygon contributes more to the interpolated value.
import geopandas as gpd
import numpy as np
df = gpd.read_file(r"/home/bera/Desktop/GIStest/missing_values.shp")
value_column = "val" #The name of your value column
df["tempid"] = range(df.shape[0]) #Create a temporary id column
#Create a buffered copy of the input df
buffered = df.copy()
buffered.geometry = buffered.geometry.buffer(20) #Adjust the buffer distance
#Intersect the dataframes
inter = gpd.overlay(df, buffered, how="intersection", keep_geom_type=True)
inter["interarea"] = inter.geometry.area
#Calculate a weighted average value for each tempid, with the intersection area as weight
df["weighted_value"] = inter.loc[~gpd.pd.isna(inter[value_column+"_2"])].groupby("tempid_1").apply(
lambda x: np.average(a=x[value_column+"_2"], weights=x["interarea"]))
df["interpol"] = df["val"].combine_first(df.weighted_value)
df.to_file(r"/home/bera/Desktop/GIStest/interpolated_result.shp")
overlay_touches
, see docs.qgis.org/latest/en/docs/user_manual/expressions/…) to get the neighboring polygon's attribute values, then do the calculation you want (e.g. mean).