Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Remplir les valeurs manquantes
Tu as repere les trous dans tes donnees, maintenant il faut les boucher. Impossible de les laisser : la plupart des algorithmes de ML plantent ou donnent des resultats aberrants face a des NaN.
La stratégie la plus courante pour les colonnes numeriques, c'est de remplacer les NaN par la moyenne ou la mediane de la colonne. La moyenne est sensible aux valeurs extremes, la mediane est plus robuste.
En pandas : df['colonne'].mean() donne la moyenne df['colonne'].median() donne la mediane df['colonne'].fillna(valeur) remplace les NaN par la valeur donnee
Écris une fonction remplir_manquantes(df, stratégie='moyenne') qui prend un DataFrame et remplace les valeurs manquantes de toutes les colonnes numeriques par la moyenne (si stratégie='moyenne') ou la mediane (si stratégie='mediane'). La fonction renvoie le DataFrame modifie.
Exemple :
import pandas as pd, numpy as np df = pd.DataFrame({'a': [1.0, np.nan, 3.0], 'b': [10.0, 20.0, np.nan]}) result = remplir_manquantes(df, 'moyenne') # a: [1.0, 2.0, 3.0], b: [10.0, 20.0, 15.0]
Tests (4/4)
Remplissage moyenne
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [1.0, np.nan, 3.0]})
result = remplir_manquantes(df, 'moyenne')
assert abs(result['a'].iloc[1] - 2.0) < 1e-9
Remplissage mediane
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [1.0, np.nan, 3.0, 100.0]})
result = remplir_manquantes(df, 'mediane')
assert abs(result['a'].iloc[1] - 3.0) < 1e-9
Ne modifie pas l'original
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [1.0, np.nan]})
remplir_manquantes(df, 'moyenne')
assert pd.isnull(df['a'].iloc[1])
Colonnes non numeriques ignorees
import pandas as pd
import numpy as np
df = pd.DataFrame({'a': [1.0, np.nan], 'b': ['x', None]})
result = remplir_manquantes(df, 'moyenne')
assert result['b'].iloc[1] is None
Indices (3 disponibles)
Solution officielle
import pandas as pd
import numpy as np
def remplir_manquantes(df, stratégie='moyenne'):
df = df.copy()
colonnes_num = df.select_dtypes(include='number').columns
for col in colonnes_num:
if stratégie == 'moyenne':
df[col] = df[col].fillna(df[col].mean())
else:
df[col] = df[col].fillna(df[col].median())
return df