I think you can use mask and add the skipna=True parameter to mean instead of dropna . It is also necessary to change the condition to data.artist_hotness == 0 , if necessary, replace the values 0 or data.artist_hotness.isnull() if necessary, replace the values NaN :
import pandas as pd import numpy as np data = pd.DataFrame({'artist_hotness': [0,1,5,np.nan]}) print (data) artist_hotness 0 0.0 1 1.0 2 5.0 3 NaN mean_artist_hotness = data['artist_hotness'].mean(skipna=True) print (mean_artist_hotness) 2.0 data['artist_hotness']=data.artist_hotness.mask(data.artist_hotness == 0,mean_artist_hotness) print (data) artist_hotness 0 2.0 1 1.0 2 5.0 3 NaN
Alternatively use loc , but leave the column name:
data.loc[data.artist_hotness == 0, 'artist_hotness'] = mean_artist_hotness print (data) artist_hotness 0 2.0 1 1.0 2 5.0 3 NaN data.artist_hotness.loc[data.artist_hotness == 0, 'artist_hotness'] = mean_artist_hotness print (data)
IndexingError: (0 True 1 False 2 False 3 False Name: artist_hotness, dtype: bool, 'artist_hotness')
Another solution to DataFrame.replace with columns:
data=data.replace({'artist_hotness': {0: mean_artist_hotness}}) print (data) aa artist_hotness 0 0.0 2.0 1 1.0 1.0 2 5.0 5.0 3 NaN NaN
Or, if you want to replace all 0 values ββin all columns:
import pandas as pd import numpy as np data = pd.DataFrame({'artist_hotness': [0,1,5,np.nan], 'aa': [0,1,5,np.nan]}) print (data) aa artist_hotness 0 0.0 0.0 1 1.0 1.0 2 5.0 5.0 3 NaN NaN mean_artist_hotness = data['artist_hotness'].mean(skipna=True) print (mean_artist_hotness) 2.0 data=data.replace(0,mean_artist_hotness) print (data) aa artist_hotness 0 2.0 2.0 1 1.0 1.0 2 5.0 5.0 3 NaN NaN
If you want to replace NaN in all columns, use DataFrame.fillna :
data=data.fillna(mean_artist_hotness) print (data) aa artist_hotness 0 0.0 0.0 1 1.0 1.0 2 5.0 5.0 3 2.0 2.0
But if only in some columns use Series.fillna :
data['artist_hotness'] = data.artist_hotness.fillna(mean_artist_hotness) print (data) aa artist_hotness 0 0.0 0.0 1 1.0 1.0 2 5.0 5.0 3 NaN 2.0