from sklearn.impute import KNNImputer
imputer=KNNImputer(n_neighbors=5, weights='uniform')
imputer.fit(df)
imputer.transform(df)
Простой код, но к сожалению его нельзя применить на неподготовленном датасете. Метод не работает со строковыми значениями. А еще он основан на "расстоянии" между ближайшими соседями. Значит данные нужно нормализовать перед использованием.
Простой способ избавиться от текстовых категорий - "One Hot Encoding"
cat_variables = df[['Geography', 'Gender']]
cat_dummies = pd.get_dummies(cat_variables, drop_first=True)
Чтобы сохранить оригинальный датасет, лучше использовать копию для дальнейших манипуляций.
df_knn = df.drop(['Geography', 'Gender'], axis=1)
df_knn = pd.concat([df_knn, cat_dummies], axis=1)
Для нормализации можно использовать StandardScaler или MinMaxScaler.
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df_knn = pd.DataFrame(scaler.fit_transform(df_knn), columns = df_knn.columns)
Ну вот теперь то уже можно использовать метод заполнения пропусков К-ближайшими соседями.
df_knn = pd.DataFrame(imputer.fit_transform(df_knn), columns = df_knn.columns)
А все заполненные значения перекинуть в оригинальный датасет для дальнейшего использования.