#pandas #dataframe #regression #sklearn-pandas #fillna
#pandas #фрейм данных #регрессия #sklearn-pandas #заполнение
Вопрос:
Извините, если этот вопрос кажется слишком для новичков, но я искал ответ, который я не нашел.
Итак, у меня есть набор данных с большим количеством значений NaN, и я работал над некоторыми регрессиями, чтобы предсказать эти нули, и поскольку прогноз задается как numpy.ndarray , я безуспешно пытаюсь заполнить пробелы в столбцах этими массивами.
Я имею в виду, что столбец выглядит примерно так:
['Records']
101 21
102 22
103 23
104 24
106 NaN
107 NaN
108 NaN
109 NaN
110 NaN
111 29
112 30
Массив:
y_pred = [25, 26, 27, 28]
Итак, fillna не обрабатывает массивы numpy для выполнения этой работы, и мои попытки устанавливали массив как dict, столбец pandas и т. Д., Но ничего не получалось.
Кроме того, другой проблемой является длина массива, которая всегда будет отличаться от исходного столбца.
Я ценю ваши идеи.
Комментарии:
1. Это не может работать, потому что разная длина массива, например, количество пропущенных значений
Ответ №1:
Сначала необходимо такое же количество пропущенных значений, как и длина массива, если хотите заменить все пропущенные значения на все значения массива:
#added value
y_pred = [25, 26, 27, 28, 30]
m = df['Records'].isna()
df.loc[m, 'Records'] = y_pred
print (df)
Records
101 21.0
102 22.0
103 23.0
104 24.0
106 25.0
107 26.0
108 27.0
109 28.0
110 30.0
111 29.0
112 30.0
Если возможно, длина не соответствует, создайте помощник Series
с фильтром по длинам и передайте в Series.fillna
:
Здесь массив имеет длину < количество NAN:
y_pred = [25, 26, 27, 28]
m = df['Records'].isna()
LenNaN = m.sum()
LenArr = len(y_pred)
s = pd.Series(y_pred[:LenNaN], index=df.index[m][:LenArr])
print (s)
106 25
107 26
108 27
109 28
dtype: int64
df['Records'] = df['Records'].fillna(s)
print (df)
Records
101 21.0
102 22.0
103 23.0
104 24.0
106 25.0
107 26.0
108 27.0
109 28.0
110 NaN
111 29.0
112 30.0
Здесь массив имеет длину> количество NAN:
y_pred = [25, 26, 27, 28, 100, 200, 300]
m = df['Records'].isna()
LenNaN = m.sum()
LenArr = len(y_pred)
s = pd.Series(y_pred[:LenNaN], index=df.index[m][:LenArr])
print (s)
106 25
107 26
108 27
109 28
110 100
dtype: int64
df['Records'] = df['Records'].fillna(s)
print (df)
Records
101 21.0
102 22.0
103 23.0
104 24.0
106 25.0
107 26.0
108 27.0
109 28.0
110 100.0
111 29.0
112 30.0
Комментарии:
1. Безусловно, это была моя ошибка, в моем конкретном случае длины одинаковы.
2. @fega_zero — Супер, если нет, тоже добавлено решение.