Pandas astuces pour imputer des données manquantes
Jetons un œil au vin fabriqué aux États-Unis. Nous pouvons définir un bloc de données contenant uniquement des vins «américains»:
df_US = df[df['country']=='US']
Maintenant, imprimons le nombre de valeurs manquantes:
print(df_US.isnull().sum())
Nous constatons qu’il manque 239 valeurs de «prix» dans les données sur les vins «américains». Pour remplir les valeurs manquantes avec la moyenne correspondant aux prix aux États-Unis, nous procédons comme suit:
df_US['price'].fillna(df_US['price'].mean(), inplace = True)
Supposons maintenant que nous voulions le faire pour les valeurs manquantes dans chaque pays. Dans une boucle for, nous pouvons définir des trames de données spécifiques au pays:
for i in list(set(df['country'])):
df_country = df[df['country']== country]
Ensuite, nous pouvons remplir les valeurs manquantes dans ces trames de données spécifiques au pays avec leurs prix moyens respectifs:
for i in list(set(df['country'])):
df_country = df[df['country']== country]
df_country['price'].fillna(df_country['price'].mean(),inplace = True)
Nous ajoutons ensuite le résultat à une liste que nous appellerons « cadres »
frames = []
for i in list(set(df['country'])):
df_country = df[df['country']== country]
df_country['price'].fillna(df_country['price'].mean(),inplace = True)
frames.append(df_country)
Enfin, nous concaténons la liste résultante de trames de données:
frames = []
for i in list(set(df['country'])):
df_country = df[df['country']== i]
df_country['price'].fillna(df_country['price'].mean(),inplace = True)
frames.append(df_country)
final_df = pd.concat(frames)
Maintenant, si nous imprimons le nombre de valeurs de prix manquantes avant l’imputation, nous obtenons:
print(df.isnull().sum())
Et après imputation:
print(final_df.isnull().sum())
Nous constatons que toutes les valeurs manquantes sauf une ont été imputées. Cela correspond aux vins d’Egypte qui ne disposent pas de données de prix. Nous pouvons résoudre ce problème en vérifiant la longueur de la trame de données dans la boucle for et en n’imputant la moyenne spécifique au pays que si la longueur est supérieure à un. Si la longueur est égale à 1, nous imputons la moyenne dans tous les pays:
frames = []
for i in list(set(df['country'])):
df_country = df[df['country']== i]
if len(df_country) > 1:
df_country['price'].fillna(df_country['price'].mean(),inplace = True)
else:
df_country['price'].fillna(df['price'].mean(),inplace = True)
frames.append(df_country)
final_df = pd.concat(frames)
En imprimant le résultat, nous constatons que toutes les valeurs ont été imputées pour la colonne « prix »:
print(final_df.isnull().sum())
Nous pouvons définir une fonction qui généralise cette logique. Notre fonction prendra des variables correspondant à une colonne numérique et une colonne catégorielle:
def impute_numerical(categorical_column, numerical_column):
frames = []
for i in list(set(df[categorical_column])):
df_category = df[df[categorical_column]== i]
if len(df_category) > 1:
df_category[numerical_column].fillna(df_category[numerical_column].mean(),inplace = True)
else:
df_category[numerical_column].fillna(df[numerical_column].mean(),inplace = True)
frames.append(df_category)
final_df = pd.concat(frames)
return final_df
Nous effectuons l’imputation à l’aide de notre fonction en exécutant ce qui suit:
impute_price = impute_numerical('country', 'price')
print(impute_price.isnull().sum())
De même, nous pouvons définir une fonction qui impute des valeurs catégorielles. Cette fonction prendra deux variables colonnes correspondantes avec des valeurs catégorielles.
def impute_categorical(categorical_column1, categorical_column2):
cat_frames = []
for i in list(set(df[categorical_column1])):
df_category = df[df[categorical_column1]== i]
if len(df_category) > 1:
df_category[categorical_column2].fillna(df_category[categorical_column2].mode()[0],inplace = True)
else:
df_category[categorical_column2].fillna(df[categorical_column2].mode()[0],inplace = True)
cat_frames.append(df_category)
cat_df = pd.concat(cat_frames)
return cat_df
Nous pouvons imputer les valeurs manquantes de « nom de dégustateur » avec le mode dans chaque pays respectif:
impute_taster = impute_categorical('country', 'taster_name')
print(impute_taster.isnull().sum())
Nous constatons que la colonne ‘taster_name’ ne contient plus aucune valeur manquante. Je m’arrête ici, mais n’hésitez pas à jouer avec les données et à coder vous-même.
CONCLUSIONS
Pour résumer, dans cet article, nous avons discuté de la façon de gérer les valeurs manquantes à l’aide de la bibliothèque Pandas. Premièrement, nous avons discuté de la façon d’imputer les valeurs numériques manquantes avec la valeur moyenne sur l’ensemble des données. Nous avons ensuite examiné comment effectuer des imputations numériques spécifiques à une catégorie. Enfin, nous avons montré comment imputer des valeurs catégorielles manquantes avec le mode correspondant à une autre colonne catégorielle. J’espère que vous avez trouvé cet article utile / intéressant. Le code de cet article est disponible sur GitHub. Merci pour la lecture!