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())
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])
def fillna(col):
col.fillna(col.value_counts().index[0], inplace=True)
return col
df=df.apply(lambda col:fillna(col))
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
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])