2016-05-29 6 views
6

Ich habe ein Python-Pandas-Datenrahmen mit mehreren Spalten und eine Spalte hat 0 Werte. Ich möchte die 0 Werte durch die median oder mean dieser Spalte ersetzen.Python/Pandas Dataframe ersetzen 0 durch Medianwert

data mein Datenrahmen ist
artist_hotness ist die Spalte

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 

ich das versucht, aber es funktioniert nicht.

Antwort

4

Ich denke, Sie können mask verwenden und Parameter skipna=True zu mean statt dropna hinzufügen. Auch braucht Zustand data.artist_hotness == 0 ändern, wenn 0 Werte oder data.artist_hotness.isnull() ersetzen müssen, wenn ersetzen müssen NaN Werte:

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 

Alternativ loc verwenden, aber weglassen Spaltenname:

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

Eine andere Lösung ist DataFrame.replace mit Angabe von Spalten:

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 

Oder wenn brauchen ersetzen alle 0 Werte in allen Spalten:

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 

Wenn benötigen ersetzen NaN in allen Spalten verwenden 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 

Aber wenn nur in einige Spalten Series.fillna verwenden:

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

Verwendung pandasreplace Methode:

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)