Проблема здесь заключается в том, что при использовании серии 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