web-dev-qa-db-ja.com

Python / Pandas Dataframeは0を中央値に置き換えます

python pandas複数の列を持つデータフレームがあり、1つの列に0値があります。0値をこの列のmedianまたはmean

dataは私のデータフレームです
artist_hotnessは列です

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

私はこれを試しましたが、うまくいきません。

7
jeangelj

mask を使用して、パラメータ__skipna=True_を mean に代わりにdropnaに追加できると思います。また、_data.artist_hotness == 0_の値を置き換える必要がある場合は_0_に、NaNの値を置き換える必要がある場合はdata.artist_hotness.isnull()に条件を変更する必要があります。

_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
_

または、 loc を使用しますが、列名は省略します。

_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名前:artist_hotness、dtype:bool、 'artist_hotness')

別の解決策は、列を指定した _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 
_

または、すべての列のすべての_0_値を置き換える必要がある場合:

_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
_

すべての列でNaNを置き換える必要がある場合は、 _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
_

ただし、一部の列でのみ _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
_
4
jezrael

pandasreplaceメソッドを使用:

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
9
shivsn
data['artist_hotness'] = data['artist_hotness'].map( lambda x : data.artist_hotness.mean() if x == 0 else x)
1

mask は非常に遅いですが、これらは非常に有用であることがわかりました(理由は不明)。

これは私がしました:

df.loc[ df['artist_hotness'] == 0 | np.isnan(df['artist_hotness']), 'artist_hotness' ] = df['artist_hotness'].median()
0
sijie.xiong