Назначение как с fillna (), так и с lo c (), видимо, не работает - PullRequest
0 голосов
/ 29 января 2020

Я искал ответ вокруг, но не могу найти его.

Моя цель: Я пытаюсь заполнить некоторые пропущенные значения в 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? Я просто хотел быть уверен , поскольку я не понимаю свою ошибку)

Здесь я пытаюсь назначить прогнозы моему фрейму данных:

#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

Как видите, я t не сделал работа: пропущенные значения по-прежнему 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

Не сработало. Я решил попробовать еще одну вещь: проверить результаты заполнения еще до того, как присвоит результаты исходному 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

Кроме того, я добавил информацию в начале вопрос

1 Ответ

1 голос
/ 29 января 2020

@Ben.T или @Dan должны публиковать свои собственные ответы, они заслуживают того, чтобы их принимали за правильные.

Следуя их подсказкам, я бы сказал, что есть два решения:

Решение 1 (Лучшее): используйте lo c ()

Проблема

Проблема с текущим решением состоит в том, что df.loc[df['my_column'].isna(), 'my_column'] ожидает получения X значения, где X - количество пропущенных значений. Моя переменная prediction фактически имеет и прогноз для пропущенных значений, и для не пропущенных значений

Решение

pred_df = df[df['my_column'].isna()]        #For the prediction, use a Dataframe with only the missing values. Problem solved
df_x = pred_df[['lat','long']]
prediction = clf.predict(df_x)
df.loc[df['my_column'].isna(), 'my_column'] = prediction

Решение 2: Используйте fillna ()

Проблема

Проблема с текущим решением состоит в том, что df['my_colum'].fillna(series_pred) требует, чтобы индексы моего df были такими же, как series_pred, то есть невозможно в этой ситуации, если у вас нет простого индекса в вашей df, например [0, 1, 2, 3, 4 ...]

Решение

Сброс индекс df в самом начале кода.

Почему это не самый лучший

Самый чистый способ - делать прогноз только тогда, когда он вам нужен , Этот подход легко получить с помощью lo c (), и я не знаю, как вы получите его с помощью fillna (), потому что вам нужно будет сохранить индекс с помощью классификации

Редактировать: series_pred.index = df['my_column'].isna().index Спасибо @ Дан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...