2016-05-29 20 views
6

Birkaç sütun içeren bir python pandaları veri çerçevem ​​var ve bir sütun 0 değerlerine sahip. 0 değerlerini bu sütunun median veya mean ile değiştirmek istiyorum.Python/Pandas Dataframe medyan değeri 0 ile değiştirin

data benim dataframe
artist_hotness olduğunu bunu denedim sütun

mean_artist_hotness = data['artist_hotness'].dropna().mean() 

if len(data.artist_hotness[ data.artist_hotness.isnull() ]) > 0: 
data.artist_hotness.loc[ (data.artist_hotness.isnull()), 'artist_hotness'] = mean_artist_hotness 

, ancak çalışmıyor.

cevap

4

Sana mask kullanabilir ve mean yerine dropna parametreyi skipna=True ekleyebilir düşünüyorum. Ayrıca yerine NaN değerleri gerekirse 0 değerleri veya data.artist_hotness.isnull() yerine gerekirse data.artist_hotness == 0 koşulu değiştirmesi gerekir: Alternatif olarak loc kullanımı

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 

ancak ihmal sütun adı:

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')

Başka bir çözüm sütunları belirtme DataFrame.replace:

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 

Ya da tüm sütunlar tüm 0 değerlerin yerine gerekirse:

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 

tüm sütunlarda NaNDataFrame.fillna kullanmak yerine gerekirse: bazı sütunlar Series.fillna kullanmak sadece eğer

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 

Ama:

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 
4

kullanımı pandasreplace yöntemi:

df = pd.DataFrame({'a': [1,2,3,4,0,0,0,0], 'b': [2,3,4,6,0,5,3,8]}) 

df 
    a b 
0 1 2 
1 2 3 
2 3 4 
3 4 6 
4 0 0 
5 0 5 
6 0 3 
7 0 8 

df['a']=df['a'].replace(0,df['a'].mean()) 

df 
    a b 
0 1 2 
1 2 3 
2 3 4 
3 4 6 
4 1 0 
5 1 5 
6 1 3 
7 1 8 
1
data['artist_hotness'] = data['artist_hotness'].map(lambda x : data.artist_hotness.mean() if x == 0 else x)