Заполнить NAN столбцов Pandas значениями массива numpy

#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 — Супер, если нет, тоже добавлено решение.