web-dev-qa-db-ja.com

pandasのカテゴリの欠損値の代入

問題は、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())
23
Igor Barinov

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 および Dataframesmodeメソッドを含む。これを使用して、各列の欠損値を埋めることができます。 (独自の最も頻繁な値を使用)このように

df = df.fillna(df.mode().iloc[0])
41
hellpanderr
def fillna(col):
    col.fillna(col.value_counts().index[0], inplace=True)
    return col
df=df.apply(lambda col:fillna(col))
4
Pratik Gohil

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
0
kevins_1

ほとんどの場合、すべての列に同じ入力戦略を使用することは望ましくありません。たとえば、カテゴリ変数には列モードを、数値列には列平均または中央値を使用できます。

# 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])
0
Sarah