問題は、pandas dataframe?のカテゴリ列の最も頻繁なレベルでNaNを入力する方法です。
R randomForestパッケージには、 na.roughfix オプションがあります:A completed data matrix or data frame. For numeric variables, NAs are replaced with column medians. For factor variables, NAs are replaced with the most frequent levels (breaking ties at random). If object contains no NAs, it is returned unaltered.
in Pandas数値変数の場合、NaN値を次のように入力できます。
df = df.fillna(df.median())
df = df.fillna(df['Label'].value_counts().index[0])
を使用して、NaNに1つの列の最も頻繁な値を入力できます。
すべての列を独自の最も頻繁な値で埋めたい場合は、使用できます
df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))
2018-25-10の更新⬇
から始まる 0.13.1
pandas Series および Dataframes のmode
メソッドを含む。これを使用して、各列の欠損値を埋めることができます。 (独自の最も頻繁な値を使用)このように
df = df.fillna(df.mode().iloc[0])
def fillna(col):
col.fillna(col.value_counts().index[0], inplace=True)
return col
df=df.apply(lambda col:fillna(col))
Scikit-learn upの最近のバージョンでは、SimpleImputer
を使用して数値とカテゴリの両方を代入できます。
import pandas as pd
from sklearn.impute import SimpleImputer
arr = [[1., 'x'], [np.nan, 'y'], [7., 'z'], [7., 'y'], [4., np.nan]]
df1 = pd.DataFrame({'x1': [x[0] for x in arr],
'x2': [x[1] for x in arr]},
index=[l for l in 'abcde'])
imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
print(pd.DataFrame(imp.fit_transform(df1),
columns=df1.columns,
index=df1.index))
# x1 x2
# a 1 x
# b 7 y
# c 7 z
# d 7 y
# e 4 y
ほとんどの場合、すべての列に同じ入力戦略を使用することは望ましくありません。たとえば、カテゴリ変数には列モードを、数値列には列平均または中央値を使用できます。
# numeric columns
>>> df.select_dtypes(include='float').fillna(\
df.select_dtypes(include='float').mean().iloc[0],\
inplace=True)
# categorical columns
>>> df.select_dtypes(include='object').fillna(\
...: df.select_dtypes(include='object').mode().iloc[0])