pandas DataFrame:nan値を列の平均で置き換えます


177

私はほとんど実数で満たされたパンダのDataFrameを持っていますが、それにはいくつかのnan値もあります。

どのようにしてnansをそれらが存在する列の平均で置き換えることができますか?

この質問はこれと非常に似ています:numpy配列:nan値を列の平均で置き換えます が、残念ながら、そこに与えられた解決策はpandas DataFrameでは機能しません。

回答:


273

を使用DataFrame.fillnaして、nan直接を埋めることができます。

In [27]: df 
Out[27]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3       NaN -2.027325  1.533582
4       NaN       NaN  0.461821
5 -0.788073       NaN       NaN
6 -0.916080 -0.612343       NaN
7 -0.887858  1.033826       NaN
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

In [28]: df.mean()
Out[28]: 
A   -0.151121
B   -0.231291
C   -0.530307
dtype: float64

In [29]: df.fillna(df.mean())
Out[29]: 
          A         B         C
0 -0.166919  0.979728 -0.632955
1 -0.297953 -0.912674 -1.365463
2 -0.120211 -0.540679 -0.680481
3 -0.151121 -2.027325  1.533582
4 -0.151121 -0.231291  0.461821
5 -0.788073 -0.231291 -0.530307
6 -0.916080 -0.612343 -0.530307
7 -0.887858  1.033826 -0.530307
8  1.948430  1.025011 -2.982224
9  0.019698 -0.795876 -0.046431

のdocstringはスカラーまたはディクショナリでfillnaあるvalue必要があると述べていますが、でも動作するようSeriesです。辞書を渡す場合は、を使用できますdf.mean().to_dict()


10
df.fillna(df.mean())新しいデータフレームを返すので、それdf=df.fillna(df.mean())を保持するために書き込む必要があります。
ヤンニス

これを使用して平均値が誤って推測される理由はありますか?
bernando_vialli

25
代わりにdf=df.fillna(df.mean())使用することもできますdf.fillna(df.mean(), inplace=True)
アンダーソンピメンテル

19
注意:これを機械学習/データサイエンスに使用する場合:データサイエンスの観点から、最初にNAを置き換えからトレーニングとテストに分割するのは間違っています...最初にトレーニングとテストに分割し、次にNAを電車で意味し、このステートフル前処理モデルをテストに適用します。以下のsklearnに関する回答を参照してください!
Fabian Werner、

1
@ amalik2205それ以外の場合は、テストセットからトレーニングセットに情報を漏らしています。次のように想像してください。100行のデータがあり、列xを考慮します。xの最初の99エントリはNAです。行100をテストセットとして分割します。行100の列xの値が20であるとします。次に、列xのトレーニングセットのすべてのエントリを20に置き換えます。この値は、テストセットの100%です。したがって、評価はあなたをだますかもしれません!
Fabian Werner


27
In [16]: df = DataFrame(np.random.randn(10,3))

In [17]: df.iloc[3:5,0] = np.nan

In [18]: df.iloc[4:6,1] = np.nan

In [19]: df.iloc[5:8,2] = np.nan

In [20]: df
Out[20]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3       NaN -0.985188 -0.324136
4       NaN       NaN  0.238512
5  0.769657       NaN       NaN
6  0.141951  0.326064       NaN
7 -1.694475 -0.523440       NaN
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

In [22]: df.mean()
Out[22]: 
0   -0.251534
1   -0.040622
2   -0.841219
dtype: float64

列ごとにその列の平均を適用して塗りつぶします

In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0)
Out[23]: 
          0         1         2
0  1.148272  0.227366 -2.368136
1 -0.820823  1.071471 -0.784713
2  0.157913  0.602857  0.665034
3 -0.251534 -0.985188 -0.324136
4 -0.251534 -0.040622  0.238512
5  0.769657 -0.040622 -0.841219
6  0.141951  0.326064 -0.841219
7 -1.694475 -0.523440 -0.841219
8  0.352556 -0.551487 -1.639298
9 -2.067324 -0.492617 -1.675794

4
理由はわかりませんが、df.fillna(df.mean())が機能せず、適用したバージョンのみが機能しました。Python 3
Rocketq 2017

12
# To read data from csv file
Dataset = pd.read_csv('Data.csv')

X = Dataset.iloc[:, :-1].values

# To calculate mean use imputer class
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(X[:, 1:3])
X[:, 1:3] = imputer.transform(X[:, 1:3])

これよりもはるかに単純な代替手段よりも優れている点は何ですか?
AMC

@Roshan Jhaロジックを説明する方が常に良いです。R&Pythonで同じタスクを実行する方法はたくさんあります。ただし、別のことを提案している場合は、そうすることのいくつかの利点を指摘する必要があるかもしれません
Dr Nisha Arora

10

欠損値を平均で補完し、列ごとに移動する場合、これはその列の平均でのみ補完します。これはもう少し読みやすいかもしれません。

sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))

3
これにより問題がどのように解決されるかについて説明してください。
Gurwinder Singh 2017

10

df.fillna(df.mean())すべてのnull値を平均で埋めるために直接使用

その列の平均値でnull値を入力する場合は、これを使用できます

x=df['Item_Weight']ここItem_Weightに列名があるとします

ここで割り当てます(xのnull値をxの平均でxに埋めます)

df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))

null値を文字列で埋めたい場合は、

ここOutlet_sizeに列名があります

df.Outlet_Size = df.Outlet_Size.fillna('Missing')

9

上記以外のオプションは次のとおりです。

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

これは、平均的には以前の応答よりもエレガントではありませんが、nullを他の列関数で置き換えたい場合は短くなる可能性があります。


7

パンダ:NaN(nan)値を1つの列の平均(平均)、中央値、またはその他の統計で置き換える方法

DataFrameがでdfあり、という列が1つあるとしますnr_items。これは: df['nr_items']

列の値を列の平均値で置き換える場合:NaNdf['nr_items']

使用方法.fillna()

mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)

新しいdfnr_item_aveを格納するために呼び出される新しい列を作成し、NaN値を列の値で置き換えましたmean

を使用するときは注意が必要meanです。外れ値がある場合は、median


0

sklearnライブラリ前処理クラスの使用

from sklearn.impute import SimpleImputer
missingvalues = SimpleImputer(missing_values = np.nan, strategy = 'mean', axis = 0)
missingvalues = missingvalues.fit(x[:,1:3])
x[:,1:3] = missingvalues.transform(x[:,1:3])

注:最近のバージョンでは、パラメーターmissing_valuesnp.nanNaN

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.