У меня есть функция check_missing_values, которая принимает массив данных в качестве входных данных и печатает положение пропущенных значений.< /p>
Код: Выделить всё
def check_missing_values(X):
"""Look for missing values in X
X: (n, p) data array
"""
missing_values = np.where(np.isnan(X))
if missing_values[0].size == 0:
print("No missing values were found.")
else:
print("Missing value(s) at:")
for row, column in zip(missing_values[0], missing_values[1]):
print("row: {}, column: {}".format(row, column))
print("Training set")
missing_values = check_missing_values(X_train)
Код: Выделить всё
Training set
Missing value(s) at:
row: 395, column: 8
При заполнении пропущенного значения исходный массив данных изменится. По этой причине я делаю копию данных X_train как X_train_imp.
Нерабочее решение
Код: Выделить всё
X_train_imp = np.copy(X_train)
# Identify all positions where X_train has NaN
missing_rows, missing_cols = np.where(np.isnan(X_train_imp))
for (r, c) in zip(missing_rows, missing_cols):
the_class = X_train_imp[r, -1]
row_ids = np.arange(X_train.shape[0])
mask_class = ((X_train[:, -1] == the_class) & (row_ids != r))
col_vals = X_train[mask_class, c]
col_vals_no_nan = col_vals[~np.isnan(col_vals)]
mean_val = np.mean(col_vals_no_nan)
X_train_imp[r, c] = mean_val
print("Done!")
Подробнее здесь: https://stackoverflow.com/questions/793 ... class-mean