web-dev-qa-db-fra.com

Imputation des valeurs manquantes pour les catégories dans pandas

La question est de savoir comment remplir les NaN avec les niveaux les plus fréquents pour la colonne catégorie dans pandas dataframe?

Dans le package R randomForest, il y a na.roughfix option: 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.

dans Pandas pour les variables numériques, je peux remplir les valeurs NaN avec:

df = df.fillna(df.median())
23
Igor Barinov

Vous pouvez utiliser df = df.fillna(df['Label'].value_counts().index[0]) pour remplir les NaN avec la valeur la plus fréquente d'une colonne.

Si vous souhaitez remplir chaque colonne avec sa propre valeur la plus fréquente, vous pouvez utiliser

df = df.apply(lambda x:x.fillna(x.value_counts().index[0]))

MISE À JOUR 2018-25-10

A partir de 0.13.1 pandas inclut la méthode mode pour Series et Dataframes . Vous pouvez l'utiliser pour remplir les valeurs manquantes pour chaque colonne (en utilisant sa propre valeur la plus fréquente) comme ceci

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

Dans les versions plus récentes de scikit-learn up, vous pouvez utiliser SimpleImputer pour imputer des chiffres et des catégories:

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

La plupart du temps, vous ne voudriez pas la même stratégie d'imputation pour toutes les colonnes. Par exemple, vous pouvez souhaiter le mode colonne pour les variables catégorielles et la moyenne ou la médiane des colonnes pour les colonnes numériques.

# 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