def func(x, a, b, c, d):
    return a * x ** 3 + b * x ** 2 + c * x + d
guess = 0.5, 0.5, 0.5, 0.5
fit_df = df.dropna()
col_params = {}
for col in fit_df.columns:
    x = fit_df.index.astype(float).values
y = fit_df[col].values
params = curve_fit(func, x, y, guess)
col_params[col] = params[0]
for col in df.columns:
    x = df[pd.isnull(df[col])].index.astype(float).values
df[col][x] = func(x, *col_params[col])
pandas экстраполяция многочлена