Попытка заполнить NaN с помощью fillna () и groupby () - PullRequest
0 голосов
/ 17 февраля 2019

Итак, у меня в основном есть набор данных Airbnb с несколькими столбцами.Некоторые из них соответствуют рейтингам различных параметров (чистота, местоположение и т. Д.).Для этих столбцов у меня есть группа NaN, которые я хочу заполнить.

Поскольку некоторые из этих NaN соответствуют спискам одного и того же владельца, я хотел заполнить некоторые из NaN соответствующими средними рейтингами хостов длякаждый из этих столбцов.

Например, предположим, что для хоста X среднее значение для review_scores_location равно 7. В столбце review_scores_location я хочу заполнить все значения NaN, соответствующиехост X, с 7.

я пробовал следующий код:

cols=['reviews_per_month','review_scores_rating','review_scores_accuracy','review_scores_cleanliness','review_scores_checkin','review_scores_communication','review_scores_location','review_scores_value']

for i in cols:
  airbnb[i]=airbnb[i].fillna(airbnb.groupby('host_id')[i].mean())

Хотя он работает и не возвращает ошибок, он не заполняет значения NaN, поскольку, когда я проверяю, есть ли еще NaN, сумма не изменилась.

Что я делаю?

Спасибо, что нашли время, чтобы прочитать это!

1 Ответ

0 голосов
/ 17 февраля 2019

Проблема здесь заключается в том, что при использовании серии airbnb.groupby('host_id')[i].mean() в fillna функция пытается выровнять индекс, и в качестве индекса airbnb.groupby('host_id')[i].mean() фактически значения столбца host_id, а не исходный индексзначения airbnb, fillna не работает, как вы ожидаете.Можно выполнить несколько опций, один из способов - использовать transform после groupby, который будет выравнивать значение mean для каждой группы с исходными значениями индекса, а затем fillna будетработать как положено, например:

for i in cols:
    airbnb[i]=airbnb[i].fillna(airbnb.groupby('host_id')[i].transform('mean'))

И даже, вы можете использовать этот метод без цикла, например:

airbnb = airbnb.fillna(airbnb.groupby('host_id')[cols].transform('mean'))

с примером:

airbnb = pd.DataFrame({'host_id':[1,1,1,2,2,2], 
                       'reviews_per_month':[4,5,np.nan,9,3,5],
                       'review_scores_rating':[3,np.nan,np.nan,np.nan,7,8]})
print (airbnb)
   host_id  review_scores_rating  reviews_per_month
0        1                   3.0                4.0
1        1                   NaN                5.0
2        1                   NaN                NaN
3        2                   NaN                9.0
4        2                   7.0                3.0
5        2                   8.0                5.0

и вы получите:

cols=['reviews_per_month','review_scores_rating'] # would work with all your columns
print (airbnb.fillna(airbnb.groupby('host_id')[cols].transform('mean')))
   host_id  review_scores_rating  reviews_per_month
0        1                   3.0                4.0
1        1                   3.0                5.0
2        1                   3.0                4.5
3        2                   7.5                9.0
4        2                   7.0                3.0
5        2                   8.0                5.0
...