私はほとんど実数で満たされたパンダのDataFrameを持っていますが、それにはいくつかのnan
値もあります。
どのようにしてnan
sをそれらが存在する列の平均で置き換えることができますか?
この質問はこれと非常に似ています:numpy配列:nan値を列の平均で置き換えます が、残念ながら、そこに与えられた解決策はpandas DataFrameでは機能しません。
私はほとんど実数で満たされたパンダのDataFrameを持っていますが、それにはいくつかのnan
値もあります。
どのようにしてnan
sをそれらが存在する列の平均で置き換えることができますか?
この質問はこれと非常に似ています:numpy配列:nan値を列の平均で置き換えます が、残念ながら、そこに与えられた解決策はpandas DataFrameでは機能しません。
回答:
を使用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()
。
df=df.fillna(df.mean())
使用することもできますdf.fillna(df.mean(), inplace=True)
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
# 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])
欠損値を平均で補完し、列ごとに移動する場合、これはその列の平均でのみ補完します。これはもう少し読みやすいかもしれません。
sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
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')
パンダ:NaN(nan
)値を1つの列の平均(平均)、中央値、またはその他の統計で置き換える方法
DataFrameがでdf
あり、という列が1つあるとしますnr_items
。これは: df['nr_items']
列の値を列の平均値で置き換える場合:NaN
df['nr_items']
使用方法.fillna()
:
mean_value=df['nr_items'].mean()
df['nr_item_ave']=df['nr_items'].fillna(mean_value)
新しいdf
列nr_item_ave
を格納するために呼び出される新しい列を作成し、NaN
値を列の値で置き換えましたmean
。
を使用するときは注意が必要mean
です。外れ値がある場合は、median
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_values
値np.nan
がNaN
df.fillna(df.mean())
新しいデータフレームを返すので、それdf=df.fillna(df.mean())
を保持するために書き込む必要があります。