Я искал ответ вокруг, но я не могу их найти.
Моя цель: я пытаюсь заполнить некоторые пропущенные значения в DataFrame, используя контролируемое обучение, чтобы решить, как его заполнить.
Мой код выглядит так: ПРИМЕЧАНИЕ. ЭТА ПЕРВАЯ ЧАСТЬ НЕ ВАЖНА, ЭТО ПРОСТО ДЛЯ КОНТЕКСТА
train_df = df[df['my_column'].notna()] #I need to train the model without using the missing data
train_x = train_df[['lat','long']] #Lat e Long are the inputs
train_y = train_df[['my_column']] #My_column is the output
clf = neighbors.KNeighborsClassifier(2)
clf.fit(train_x,train_y) #clf is the classifies, here we train it
df_x = df[['lat','long']] #I need this part to do the prediction
prediction = clf.predict(df_x) #clf.predict() returns an array
series_pred = pd.Series(prediction) #now the array is a series
print(series_pred.shape) #RETURNS (2381,)
print(series_pred.isna().sum()) #RETURN 0
Все идет нормально. У меня есть 2381 прогноз (мне нужно всего несколько из них) и внутри нет значения NaN (зачем в прогнозах должно быть значение NaN? Я просто хотел убедиться< /strong>, так как я не понимаю своей ошибки)
Здесь я пытаюсь назначить прогнозы моему кадру данных:
#test_1
df.loc[df['my_colum'].isna(), 'my_colum'] = series_pred #I assign the predictions using .loc()
#test_2
df['my_colum'] = df['my_colum'].fillna(series_pred) #Double check: I assign the predictions using .fillna()
print(df['my_colum'].shape) #RETURNS (2381,)
print(df['my_colum'].isna().sum()) #RETURN 6
Как видите, это не сработало: недостающие значения по-прежнему равны 6. Я случайно попробовал немного другой подход:
#test_3
df[['my_colum']] = df[['my_colum']].fillna(series_pred) #Will it work?
print(df[['my_colum']].shape) #RETURNS (2381, 1)
print(df[['my_colum']].isna().sum()) #RETURNS 6
Не сработало. Я решил попробовать еще одну вещь: проверить результат fillna еще до назначения результатов исходному df:
In[42]:
print(df['my_colum'].fillna(series_pred).isna().sum()) #extreme test
Out[42]:
6
Итак... где моя очень-очень глупая ошибка? Большое спасибо
РЕДАКТИРОВАТЬ 1
Чтобы показать немного данных,
In[1]:
df.head()
Out[1]:
my_column lat long
id
9df Wil 51 5
4f3 Fabio 47 9
x32 Fabio 47 8
z6f Fabio 47 9
a6f Giovanni 47 7
Кроме того, я добавил информацию в начале вопроса
series_pred
df
? - person Dan   schedule 29.01.2020df.loc[df['my_colum'].isna(), 'my_colum'] = series_pred[df['my_colum'].isna()]
? И в чем разница междуdf
иdf_x
? - person Dan   schedule 29.01.2020series_pred.index = df.index
. Я бы предположил, что что-то вродеfillna
соответствует индексу, а не местоположению. - person Dan   schedule 29.01.2020fillna
он выравнивается по индексу. Если вы уверены в размере ваших данных, то это должен сделатьdf.loc[df['my_colum'].isna(), 'my_colum'] = prediction
, не нужно создавать Series - person Ben.T   schedule 29.01.2020df.loc[df['my_colum'].isna(), 'my_colum']
на самом деле должно состоять только из 6 элементов, а предсказание состоит из 2381 элемента. - person Federico Dorato   schedule 29.01.2020clf
будет обучен, попробуйтеdf.loc[df['my_colum'].isna(), 'my_colum'] = clf.predict(df.loc[df['my_colum'].isna(), ['lat','long']])
- person Ben.T   schedule 29.01.2020