Préparer les données avec pandas

Les données réelles sont rarement prêtes à être analysées. Ce cours montre comment préparer un DataFrame pandas : repérer et traiter les valeurs manquantes et les lignes en double, remplacer et mettre en correspondance les valeurs, les répartir en classes, nettoyer le texte avec des méthodes de chaînes et des expressions régulières, et stocker les étiquettes répétées sous forme de catégories. Tu combines ensuite des tables avec merge, join et concat, puis tu passes du format long au format large et inversement avec des index hiérarchiques, stack, unstack, pivot et melt. Chaque méthode est accompagnée d’un court exemple détaillé et des erreurs à surveiller, comme les fusions qui ajoutent des lignes sans avertissement.

IntermédiaireUnité 4 sur 8 de la formation Formation : Python et pandas : NumPy, analyse et visualisation de données

Ce que tu vas apprendre

  1. Détecter les valeurs manquantes et les lignes en double dans un DataFrame pandas, décider de les supprimer, de les remplacer ou de les conserver, et vérifier l’effet de chaque choix sur les données.
    • Détecter les valeurs manquantes dans un DataFrame
      Reconnaître les marqueurs de données manquantes de pandas, compter ces données par colonne et par ligne, et repérer les codes cachés qui représentent des valeurs manquantes.
    • Supprimer ou remplacer les valeurs manquantes
      Supprimer les lignes ou colonnes incomplètes avec dropna, ou remplacer les valeurs manquantes par des valeurs fixes, des statistiques, des valeurs voisines ou une interpolation, et choisir la méthode adaptée aux données.
    • Repérer et supprimer les lignes en double
      Marquer et supprimer les lignes répétées avec duplicated et drop_duplicates, comparer uniquement les colonnes clés si nécessaire et conserver la bonne copie de chaque enregistrement.
  2. Modifier les valeurs d’une colonne de façon maîtrisée : remplacer des codes, mettre des valeurs en correspondance, convertir des types, renommer des étiquettes et transformer des nombres en groupes, en valeurs mises à l’échelle et en colonnes indicatrices.
    • Remplacer, mettre en correspondance et convertir des valeurs
      Remplacer des valeurs exactes avec replace, mettre des valeurs en correspondance à l’aide d’un dictionnaire ou d’une fonction avec map, renommer des lignes et des colonnes, et convertir du texte en nombres de façon sûre.
    • Discrétiser, mettre à l’échelle, écrêter et encoder des valeurs
      Regrouper des nombres dans des intervalles avec cut et qcut, mettre des colonnes à l’échelle, limiter les valeurs extrêmes avec clip et créer des colonnes indicatrices pour les catégories.
  3. Standardiser les colonnes textuelles et y effectuer des recherches avec l’accesseur str et les expressions régulières, puis stocker efficacement sous forme catégorielle les colonnes dont l’ensemble de valeurs est fixe.
    • Nettoyer les colonnes textuelles avec les méthodes de chaînes de caractères
      Utiliser les méthodes str vectorisées pour supprimer les espaces superflus, modifier la casse, découper, rechercher, remplacer et combiner le texte de toutes les lignes d’une colonne à la fois.
    • Rechercher et extraire des motifs à l’aide d’expressions régulières
      Écrire des expressions régulières simples et les utiliser avec contains, extract, findall et replace pour tester, extraire et nettoyer des parties structurées de texte.
    • Utiliser le type catégoriel
      Convertir les colonnes qui comportent un ensemble limité de valeurs en colonnes catégorielles, utiliser leurs catégories et leurs codes, et employer des catégories ordonnées pour les valeurs qui ont un ordre naturel.
  4. Réunir les données de plusieurs tables : faire correspondre les lignes par colonnes clés ou étiquettes d’index avec merge et join, compléter les valeurs manquantes depuis une deuxième source et empiler des tables avec concat.
    • Fusionner des DataFrame sur des colonnes clés
      Combiner deux tables en faisant correspondre les valeurs de colonnes clés avec merge, choisir le type de jointure et vérifier les lignes sans correspondance ou multipliées dans le résultat.
    • Effectuer une jointure sur l’index et compléter les valeurs manquantes à partir d’une autre table
      Fusionner sur les étiquettes d’index avec join ou left_index et right_index, et utiliser combine_first et l’alignement des étiquettes pour compléter les valeurs manquantes depuis une deuxième source.
    • Empiler des DataFrame avec concat
      Assembler des tables selon les lignes ou les colonnes avec pd.concat, maîtriser l’index et les colonnes du résultat et indiquer la provenance de chaque partie.
  5. Travailler avec des tables qui possèdent plusieurs niveaux d’index et passer du format long au format large et inversement avec stack, unstack, pivot et melt.
    • Travailler avec des index hiérarchiques
      Construire et lire un MultiIndex, sélectionner des données selon les niveaux externes et internes, réordonner et trier les niveaux, et déplacer des niveaux entre l’index et les colonnes.
    • Remodeler les données avec stack et unstack
      Déplacer les étiquettes de colonnes dans l’index avec stack et les niveaux d’index dans les colonnes avec unstack, et traiter les combinaisons manquantes que le remodelage fait apparaître.
    • Passer du format long au format large et inversement avec pivot et melt
      Reconnaître les formats long et large, transformer des données au format long en table au format large avec pivot ou pivot_table, et transformer une table au format large en données au format long avec melt.

Préparer les données avec pandas : cours

5 chapitres

1

Repérer et traiter les valeurs manquantes et les doublons

Une valeur manquante, un zéro et un enregistrement répété ont des significations différentes. Apprends à quantifier les données manquantes avant de choisir ce que tu conserves, supprimes ou estimes, et à identifier les doublons à l’aide des colonnes qui définissent un enregistrement. De petites tables météorologiques et de commandes montrent comment pandas met ces décisions en œuvre et comment elles influent sur le nombre de lignes, les types de données et les statistiques. Chaque modification produit un résultat visible que tu peux vérifier avant de poursuivre une analyse.

1.1 Repérer les valeurs manquantes avant de calculer

Une donnée manquante est une valeur inconnue ou indisponible. pandas stocke un marqueur spécial à sa place. Détecte ce marqueur avant de calculer des totaux ou de décider quelles lignes sont utilisables.

Reconnaître les marqueurs

Le marqueur dépend du type de données. Les colonnes de nombres à virgule flottante utilisent NaN, les colonnes de dates et heures utilisent NaT, et les types nullables comme "Int64", "boolean" et "string" utilisent pd.NA. pandas 3 infère le type str pour les colonnes textuelles, avec NaN pour le texte manquant. Le None de Python est lui aussi reconnu comme manquant. Utilise import pandas as pd et import numpy as np pour les exemples.

df.isna() produit un tableau booléen ayant les mêmes lignes et colonnes que df. Un True marque une valeur manquante ; df.notna() marque les valeurs présentes. Les alias isnull() et notnull() remplissent les mêmes fonctions. Ne compare pas une colonne à np.nan : NaN est différent même de lui-même, donc s == np.nan ne repère pas les valeurs manquantes.

Compter les cellules et les lignes concernées

Considère ces relevés météorologiques :

citytemp_crain_mm
Lima18,00,0
OsloNaN4,0
Pune31,0NaN
KyivNaNNaN

Un True booléen compte pour 1, donc df.isna().sum() donne 0 ville, 2 températures et 2 relevés de pluie manquants. df.isna().mean() donne les proportions 0.0, 0.5 et 0.5. La proportion de chaque colonne utilise les quatre lignes comme dénominateur.

Pour trouver les lignes concernées, utilise df.isna().any(axis=1). Le résultat est False, True, True, True ; sa somme vaut 3. En revanche, df.isna().sum().sum() donne 4 cellules manquantes. Kyiv compte pour deux cellules mais une seule ligne concernée. Utilise la mesure qui répond à ta question.

Reconnaître les codes cachés de valeurs manquantes

Un instrument peut enregistrer un relevé indisponible sous la forme -999, "-" ou "unknown". Ce sont des valeurs ordinaires tant que tu ne les convertis pas. Après avoir confirmé la signification du code, utilise df.replace([-999, "unknown"], np.nan). Lors du chargement d’un CSV, na_values=[-999, "unknown"] ajoute ces codes aux marqueurs reconnus. Les champs CSV vides et les chaînes courantes comme "NA", "n/a" et "NULL" sont déjà reconnus par défaut.

Un relevé de pluie égal à zéro peut signifier qu’il n’a pas plu ; remplacer tous les zéros détruirait donc des observations réelles. De plus, une chaîne vide créée en mémoire, "", et une chaîne contenant des espaces ne sont pas considérées comme manquantes par isna(). Examine le texte stocké ainsi que les décomptes de marqueurs. Pour inclure les catégories manquantes dans un tableau des effectifs et des fréquences, utilise value_counts(dropna=False).

Vérifier les calculs et les types de données

Pour s = pd.Series([4, np.nan, 8]), s.mean() vaut 6.0 : la méthode utilise les deux valeurs connues. s.count() vaut 2, tandis que len(s) vaut 3. Diviser s.sum() par len(s) donne 4.0 et traite à tort la valeur manquante comme un zéro. La plupart des statistiques ignorent les valeurs manquantes par défaut ; une colonne entièrement manquante a une somme de 0 mais une moyenne de NaN.

Une valeur manquante peut aussi modifier le stockage. pd.Series([3, None, 5]) devient float64 et contient 3.0, NaN et 5.0. Indiquer dtype="Int64" conserve des valeurs entières avec <NA> pour la valeur manquante. Le I majuscule identifie le type entier nullable de pandas.

Points clés

  • Utilise isna() pour détecter les marqueurs de valeurs manquantes dans les différents types de données.
  • Compte séparément les cellules manquantes et les lignes comportant au moins une valeur manquante.
  • Convertis les codes dont la signification manquante est confirmée ; conserve les zéros valides.
  • Vérifie le nombre de valeurs connues utilisées dans une statistique.
  • Utilise "Int64" lorsque des valeurs entières nécessitent un marqueur de valeur manquante.

1.2 Choisir les valeurs à supprimer ou à remplacer

Supprimer une ligne retire ses valeurs connues en même temps que ses valeurs manquantes. Remplacer une valeur manquante conserve la ligne mais introduit une estimation. Choisis selon la signification de l’observation et les colonnes nécessaires à l’analyse.

Maîtriser les lignes supprimées

df.dropna() supprime toutes les lignes qui comportent une valeur manquante. Dans la table météorologique, seule Lima reste. Limite la décision avec subset, ou exige un nombre minimal de cellules présentes avec thresh.

AppelLignes conservéesRaison
df.dropna(subset=["temp_c"])Lima, PuneLa température est présente
df.dropna(thresh=2)Lima, Oslo, PuneAu moins deux cellules sont présentes
df.dropna(how="all")Les quatreChaque ligne contient une ville

axis="columns" supprime les colonnes qui comportent des valeurs manquantes et ne conserve ici que city. Dans une table comportant de nombreuses colonnes, la règle par défaut appliquée aux lignes peut supprimer une grande partie des données, car une valeur manquante dans n’importe quelle colonne suffit. Compare len(df) avant et après la suppression.

Affecter le résultat

Apprends la forme avec réaffectation : df = df.dropna(). Par défaut, les méthodes de nettoyage renvoient un nouvel objet. pandas 3.1 déprécie inplace=True pour des méthodes comme dropna, drop_duplicates et rename.

Pour une colonne, écris df["temp_c"] = df["temp_c"].fillna(0). Avec la copie à l’écriture de pandas 3, un appel chaîné comme df["temp_c"].fillna(0, inplace=True) ne modifie jamais le DataFrame parent. L’affectation indique explicitement la destination.

Remplacer par une valeur compatible

Un dictionnaire par colonne permet de fournir des valeurs adaptées à une table mixte : df.fillna({"rain_mm": 0, "city": "Unknown"}). Les colonnes absentes du dictionnaire conservent leurs valeurs manquantes. Un scalaire comme 0 est pratique pour une table composée uniquement de nombres dont toutes les colonnes l’acceptent. Remplacer du texte manquant par un nombre est incompatible ; pandas 3.1 émet un avertissement et une future version le refusera.

Les températures connues sont 18,0 et 31,0. Leur moyenne est de 24,5, donc df["temp_c"].fillna(df["temp_c"].mean()) place 24,5 dans les deux cases manquantes. Une valeur extrême peut fortement tirer la moyenne ; la médiane y est moins sensible. Avant le remplacement, conserve un indicateur avec df["temp_missing"] = df["temp_c"].isna() afin de pouvoir distinguer les valeurs estimées des valeurs observées.

Le remplacement par la moyenne réduit la dispersion apparente de la colonne. Une valeur fixe éloignée peut l’augmenter. Remplacer une mesure de pluie manquante par 0 affirme qu’il n’a pas plu, ce qui ne convient pas si le capteur était éteint.

Utiliser les relevés voisins lorsque l’ordre compte

ffill() propage la dernière valeur connue vers l’avant ; bfill() propage la prochaine valeur connue vers l’arrière. Pour 12,0 ; NaN ; NaN ; NaN ; 15,0, la propagation vers l’avant donne quatre valeurs 12.0 suivies de 15.0. ffill(limit=1) ne remplace que la première valeur manquante de cette suite. Une valeur manquante en début de série n’a pas de valeur précédente et reste manquante. Utilise directement ffill() ; fillna(method="ffill") a été supprimé dans pandas 3.

interpolate() estime les valeurs entre des positions voisines. Pour 10, NaN, NaN, 16, l’interpolation linéaire donne 10, 12, 14, 16. Elle convient aux mesures qui évoluent progressivement dans un ordre qui a un sens. Propager ou interpoler des valeurs entre des villes sans lien imposerait une relation que les lignes n’ont pas.

Après toute opération, exécute à nouveau isna().sum() et vérifie le nombre de lignes. Un appel de méthode réussi indique que le code s’est exécuté ; ces vérifications indiquent ce qui a changé.

Points clés

  • Utilise subset, how ou thresh pour indiquer quelles valeurs manquantes comptent.
  • Affecte les résultats renvoyés au DataFrame ou à la colonne que tu souhaites modifier.
  • Choisis des valeurs de remplacement adaptées au type de la colonne et à la signification de la valeur manquante.
  • Conserve un indicateur des valeurs manquantes avant de les remplacer par des estimations.
  • N’utilise les méthodes fondées sur les valeurs voisines que lorsque l’ordre des lignes a un sens.
  • Vérifie le nombre de lignes et de valeurs manquantes après le nettoyage.

1.3 Identifier l’enregistrement avant de supprimer ses copies

Deux lignes peuvent se ressembler sans décrire le même événement. Avant de supprimer des doublons, détermine quelles valeurs identifient un enregistrement. Un identifiant de commande peut identifier une commande ; le client et la date seuls peuvent désigner plusieurs achats légitimes.

Marquer les copies supplémentaires

df.duplicated() renvoie un booléen par ligne. Par défaut, cette méthode compare toutes les colonnes, conserve la première occurrence et marque les copies suivantes par True. La somme du résultat compte les copies supplémentaires, et non tous les membres des groupes répétés.

Considère six lignes de commandes d’identifiants 101, 102, 102, 103, 104, 104. Les deux lignes 102 sont identiques. Les deux lignes 104 ont des poids enregistrés différents, 0,5 kg et 0,8 kg. Lorsque toutes les colonnes sont comparées, il y a une copie supplémentaire : df.duplicated().sum() vaut 1. df.drop_duplicates() conserve cinq lignes car les deux lignes 104 différentes ne sont pas des copies exactes.

Comparer les colonnes qui définissent l’identité

df.duplicated(subset=["order_id"]) ne compare que les identifiants. Cette méthode marque le deuxième 102 et le deuxième 104, soit deux copies supplémentaires. Les valeurs des autres colonnes n’influent plus sur cette décision. Examine les poids contradictoires avant de choisir l’enregistrement de commande à conserver.

Valeur de keepTraitement d’un groupe répété
"first"Conserver la première ligne dans l’ordre actuel
"last"Conserver la dernière ligne dans l’ordre actuel
FalseSupprimer tous les membres d’un groupe répété

df.drop_duplicates(subset="order_id", keep="last") conserve la version de 0,8 kg de la commande 104 dans cet ordre. Conserver la dernière ligne ne signifie pas en soi conserver l’enregistrement le plus récent. Établis d’abord cet ordre :

latest = df.sort_values("updated").drop_duplicates(
    subset="customer_id", keep="last"
)

Le tri selon updated place les enregistrements anciens avant les plus récents. La recherche de doublons ne compare ensuite que customer_id : des dates de mise à jour différentes n’empêchent donc pas de reconnaître deux lignes comme des versions du même client.

Distinguer les valeurs des lignes des étiquettes d’index

Ces méthodes comparent les valeurs et ignorent les étiquettes d’index. Des lignes identiques portant les étiquettes 4 et 9 comptent tout de même comme des doublons. Pour cette vérification, les valeurs manquantes aux positions correspondantes sont considérées comme égales. Pour rechercher les étiquettes elles-mêmes répétées, utilise df.index.duplicated().

La comparaison exacte tient aussi compte des différences de casse et d’espacement. Les valeurs « Lisbon » précédée d’un espace, « lisbon » et « LISBON » suivie d’un espace sont distinctes. Nettoie-les avec .str.strip().str.lower() avant de rechercher les doublons lorsque ces écritures désignent la même ville. Sinon, nunique() comptera trois noms pour un seul lieu.

Vérifier l’unicité là où la relation l’exige

Une table de correspondance doit comporter une ligne par clé de correspondance lorsque chaque enregistrement doit recevoir un seul ensemble de détails. lookup["customer_id"].is_unique vérifie cette exigence. Des identifiants de clients répétés dans une table de commandes sont normaux, car un client peut passer plusieurs commandes.

Si une clé de correspondance se répète, une fusion ultérieure répète chaque commande correspondante pour chaque ligne correspondante de la table de correspondance. Supprimer les doublons des commandes éliminerait de véritables achats sans corriger la table de correspondance. Vérifie la clé prévue dans la bonne table, examine les enregistrements contradictoires et compare le nombre de lignes après la suppression.

Points clés

  • Définis un enregistrement à l’aide des bonnes colonnes clés avant de supprimer ses copies.
  • duplicated().sum() compte les copies suivantes avec l’option par défaut keep="first".
  • Trie par date de mise à jour avant de conserver l’enregistrement le plus récent.
  • La recherche de doublons parmi les valeurs des lignes et celle d’étiquettes d’index répétées sont deux vérifications distinctes.
  • L’unicité des clés de correspondance évite la multiplication accidentelle des lignes lors des fusions.
2

Transformer les valeurs par remplacement, mise en correspondance et discrétisation

Transformer une colonne modifie la signification ou la représentation de ses valeurs. Choisis entre les remplacements exacts, les mises en correspondance, la conversion numérique, les intervalles, les valeurs mises à l’échelle et les colonnes indicatrices. Tu examineras les entrées et les sorties de chaque méthode, y compris le sort des valeurs sans correspondance et des valeurs situées aux bornes, afin qu’une opération pratique ne modifie pas silencieusement les catégories ou ne fasse pas perdre des mesures utilisables.

2.1 Modifier les valeurs et les étiquettes de façon réfléchie

Un remplacement modifie les valeurs correspondantes, une mise en correspondance traduit les valeurs et un renommage modifie les étiquettes. Ces opérations peuvent se ressembler dans le code, mais produisent des résultats différents lorsqu’une valeur est absente d’un dictionnaire.

Remplacer des valeurs exactes

s.replace("N/A", np.nan) ne modifie que les cellules égales à "N/A". Une liste peut indiquer plusieurs anciennes valeurs : s.replace(["-", "?"], np.nan). Un dictionnaire fournit des remplacements distincts, comme dans s.replace({"M": "male", "F": "female"}). Les valeurs sans correspondance restent inchangées.

Pour une table entière, un dictionnaire imbriqué limite la modification à une colonne : df.replace({"status": {0: "open", 1: "closed"}}). Cela évite de modifier d’autres zéros et uns sans rapport ailleurs dans la table. Affecte le résultat renvoyé pour conserver la modification.

replace recherche des cellules entières. Avec « Main St » et « St », s.replace("St", "Street") ne modifie que « St ». Pour modifier des parties d’une chaîne, utilise s.str.replace("St", "Street", regex=False), qui produit aussi « Main Street ».

Mettre en correspondance à l’aide d’un dictionnaire

Pour les codes « PT », « JP » et « KE », compare le même dictionnaire dans deux méthodes :

MéthodePTJPKE
s.map({"PT": "Portugal", "JP": "Japan"})PortugalJapanNaN
s.replace({"PT": "Portugal", "JP": "Japan"})PortugalJapanKE

Un dictionnaire transmis à map définit les sorties disponibles. Une clé absente n’a pas de sortie et devient une valeur manquante. Vérifie ensuite isna().sum() pour repérer une correspondance incomplète.

map accepte aussi une fonction : s.map(lambda x: x * 1000) convertit des valeurs en kilomètres en mètres. Pour ce calcul, s * 1000 est plus simple et plus rapide car l’opération porte sur toute la colonne. DataFrame.map applique une fonction cellule par cellule ; cette méthode remplace applymap, qui a été supprimée.

Convertir du texte en nombres

astype demande un type de données, comme "float64", "Int64" ou "category". Cette méthode déclenche une erreur si une valeur ne peut pas être convertie. Pour les textes "12", "7.5" et "n/a", pd.to_numeric(s, errors="coerce") produit en revanche 12.0, 7.5 et NaN. La coercition conserve les nombres lisibles mais impose d’examiner les échecs.

Le formatage peut empêcher la conversion même lorsque le nombre est valide. Pour « 1,200 » et « 950 », supprime d’abord le séparateur de milliers :

cleaned = s.str.replace(",", "", regex=False)
numbers = pd.to_numeric(cleaned, errors="coerce")
failed = s.notna() & numbers.isna()

Ici, failed marque les valeurs qui étaient présentes avant la conversion mais sont devenues manquantes. Comparer uniquement les nombres de valeurs manquantes donne un total utile ; le masque permet aussi de retrouver le texte d’origine à examiner. Supprime de la même manière et de façon réfléchie les unités connues des mesures textuelles avant la conversion.

Renommer les étiquettes

df.rename(columns={"Qty": "quantity"}) modifie un en-tête de colonne sans changer ses cellules. df.rename(columns=str.lower) met tous les en-têtes en minuscules. Une séquence comme df.columns.str.strip().str.lower().str.replace(" ", "_", regex=False) transforme « Total KG » suivi d’un espace en total_kg ; affecte-la à df.columns.

Utilise replace ou map pour les valeurs à l’intérieur d’une colonne. Utilise rename pour les étiquettes qui servent à sélectionner ces valeurs.

Points clés

  • replace conserve les valeurs sans correspondance ; map avec un dictionnaire les rend manquantes.
  • Utilise .str.replace pour modifier une partie de chaque valeur textuelle.
  • Privilégie les calculs vectorisés pour les calculs simples sur les colonnes.
  • Examine les nouvelles valeurs manquantes après une coercition numérique.
  • rename modifie les étiquettes et laisse les valeurs des données inchangées.

2.2 Regrouper et mettre à l’échelle les mesures

Certaines analyses nécessitent des mesures exactes, d’autres des groupes ou des plages numériques comparables. Garde leur signification claire : la discrétisation crée des catégories, la mise à l’échelle modifie l’échelle numérique et l’écrêtage remplace les valeurs extrêmes.

Répartir les valeurs dans des intervalles

pd.cut(ages, [18, 30, 45, 65]) utilise les intervalles (18, 30], (30, 45] et (45, 65]. La parenthèse exclut la borne gauche ; le crochet fermant inclut la borne droite. Les âges 19, 25 et 30 entrent dans le premier intervalle, 41 dans le deuxième et 64 dans le troisième. L’âge 18 devient manquant car il se trouve sur la borne gauche exclue.

include_lowest=True inclut cette valeur minimale dans le premier intervalle. right=False crée au contraire des intervalles fermés à gauche comme [18, 30), si bien que 30 entre dans le deuxième intervalle. Les valeurs situées hors de tous les intervalles restent manquantes. Teste les bornes exactes ainsi que des valeurs typiques situées entre elles.

Il faut une étiquette par intervalle, soit une de moins que le nombre de bornes. Avec labels=["18-30", "31-45", "46-65"] et include_lowest=True, les six âges ci-dessus donnent les effectifs 4, 1 et 1. Ces étiquettes décrivent des âges entiers ; les bornes des intervalles continuent de déterminer l’affectation.

Choisir les bornes ou les effectifs des groupes
OpérationCe qu’elle détermineUtilité
pd.cut(x, [18, 30, 45, 65])Bornes fixesIntervalles qui ont un sens
pd.cut(x, 4)Quatre intervalles de même amplitudeComparer des plages de valeurs
pd.qcut(x, 4)Quatre groupes d’effectifs à peu près égauxComparer les rangs dans les données

Pour 2, 4, 6, 8, 10, 12, 14, 16, qcut donne deux valeurs par groupe défini par les quartiles. Des groupes de même effectif ne couvrent pas nécessairement des intervalles de même amplitude.

Mettre à l’échelle sans créer de groupes

La normalisation min-max utilise (x - x.min()) / (x.max() - x.min()). Pour 10, 20, 40, l’étendue est de 30 : les résultats sont 0, environ 0,333 et 1. Le minimum et le maximum sont tous deux nécessaires ; diviser par le seul maximum est une opération différente. Une colonne constante a une étendue nulle, donc cette expression ne peut pas lui donner une dispersion mise à l’échelle utile.

Le centrage et la réduction utilisent (x - x.mean()) / x.std(). Pour 10, 20, 30, la moyenne est de 20 et l’écart-type d’échantillon utilisé par défaut par pandas est de 10. Soustraire 20 et diviser par 10 donne les scores z -1, 0 et 1. Un score z décrit la distance à la moyenne en unités d’écart-type, pas une étiquette d’intervalle.

Écrêter et encoder

pd.Series([5, 12, 250, 8]).clip(upper=100) donne 5, 12, 100, 8. Contrairement à un filtre, clip conserve la ligne et remplace le nombre extrême. Examine les grandes valeurs avec describe() ou un filtre avant de les écrêter : une grande mesure réelle reste une donnée.

pd.get_dummies(s) crée une colonne indicatrice booléenne par catégorie. Avec rouge, vert, rouge, bleu, chaque ligne vaut True uniquement dans la colonne de sa couleur. Utilise dtype=int pour obtenir des zéros et des uns. Les valeurs manquantes donnent des indicateurs tous faux, sauf si dummy_na=True ajoute une colonne de valeurs manquantes. Pour une régression par les moindres carrés ordinaires avec une constante, drop_first=True supprime une colonne de catégorie redondante ; d’autres modèles peuvent conserver toutes les catégories. Avec une catégorie par ligne, la somme de toutes les indicatrices est égale à la constante 1, ce qui crée une dépendance linéaire.

Pour les cellules contenant plusieurs étiquettes, s.str.get_dummies(sep="|") découpe une valeur comme « Action|Comedy » en indicateurs distincts. Les intervalles obtenus par discrétisation peuvent aussi être transmis à get_dummies, ce qui donne une colonne par intervalle.

Points clés

  • Vérifie les bornes des intervalles et les valeurs hors intervalle avec cut.
  • cut détermine les intervalles ; qcut vise des groupes d’effectifs similaires.
  • La normalisation min-max et les scores z conservent les valeurs numériques sur une échelle modifiée.
  • clip écrête les valeurs sans supprimer de lignes.
  • Les colonnes indicatrices représentent l’appartenance aux catégories sans inventer d’ordre numérique.
  • Traite explicitement les catégories manquantes lorsque leurs indicateurs comptent.
3

Nettoyer les données textuelles et catégorielles

Les valeurs textuelles doivent avoir une orthographe et un espacement cohérents avant de pouvoir servir de catégories ou de clés. Applique des méthodes de chaînes à une colonne, extrais des parties structurées avec des expressions régulières et choisis un type catégoriel lorsqu’un petit ensemble d’étiquettes se répète. Les exemples relient le nettoyage du texte aux recherches de doublons et aux fusions, tout en montrant en quoi les codes stockés et l’ordre des catégories diffèrent des mots visibles dans une table.

3.1 Harmoniser les valeurs textuelles

Une personne reconnaît la même ville dans « Lisbon » précédé d’un espace, « lisbon » et « LISBON » suivi d’un espace. pandas voit trois chaînes différentes. Nettoyer une colonne textuelle fournit un ensemble cohérent de valeurs à comparer lors des décomptes, des recherches de doublons et des fusions ultérieurs.

Appliquer des méthodes de chaînes à une Series

L’expression Python "Lima ".strip() agit sur une seule chaîne. Pour une colonne, utilise l’accesseur .str : s.str.strip() supprime les espaces superflus de chaque valeur non manquante. s.lower() déclenche une AttributeError car la Series elle-même ne possède pas de méthode lower. Utilise s.str.lower().

pandas 3 infère normalement le type str pour le texte, en remplacement de l’ancien type par défaut object. Le type str contient du texte et des valeurs manquantes, avec NaN pour le texte manquant. Les méthodes de chaînes fonctionnent sur les deux types. Affecte du texte à une colonne str ; si un nombre doit y figurer sous forme de texte, convertis-le d’abord.

Combine les opérations de nettoyage compatibles et affecte le résultat :

df["city"] = df["city"].str.strip().str.lower()

Les trois écritures de Lisbon deviennent « lisbon ». strip() supprime les caractères d’espacement aux extrémités, pas les espaces à l’intérieur d’un nom. upper() met toutes les lettres en majuscules, tandis que title() met une majuscule à chaque mot et transforme « new york » en « New York ». Choisis une forme cohérente pour les clés et les décomptes.

Découper des chaînes structurées

Pour « Silva, Ana » et « Tanaka, Yui », s.str.split(", ") renvoie des listes comme ["Silva", "Ana"]. Ajoute expand=True pour produire des colonnes distinctes. Récupère une partie de chaque liste avec .str[0] ou .str.get(1).

Si seul le premier séparateur doit découper une valeur, utilise n=1. Découper « a,b,c » aux virgules avec n=1 donne « a » et « b,c ». Sans limite, le résultat comporte trois parties. Indique exactement le séparateur, y compris tout espace faisant partie du format.

Rechercher et filtrer

s.str.contains("lis", case=False) recherche le texte n’importe où en ignorant la casse. s.str.startswith("ID") vérifie le début ; s.str.endswith(".csv") vérifie la fin. Les résultats booléens peuvent servir à sélectionner des lignes :

mask = df["city"].str.contains("san", case=False, na=False)
selected = df[mask]

Pour le type str de pandas 3, le texte manquant donne False dans ces tests de recherche. Écrire na=False indique aussi clairement le traitement voulu lorsque tu utilises des données textuelles nullables. contains interprète par défaut un motif comme une expression régulière ; ajoute regex=False pour rechercher littéralement du texte contenant des caractères spéciaux.

Remplacer des parties et construire de nouvelles chaînes

s.str.replace("kg", "", regex=False) supprime « kg » partout où il apparaît. s.replace("kg", "") ne modifie que les cellules qui valent exactement « kg ». Cette distinction compte pour des valeurs comme « 12 kg ».

str.replace traite son texte de recherche littéralement par défaut. Pour « 3.5 kg », .str.replace(".", "", regex=False) supprime le point et donne « 35 kg ». Avec regex=True, le point est un motif correspondant à presque n’importe quel caractère et supprime tous les caractères dans cet exemple sur une seule ligne. N’utilise jamais cette modification pour analyser une mesure décimale.

s.str.len() compte les caractères ; une valeur manquante produit NaN et peut donner une colonne de nombres à virgule flottante. s.str[:3] extrait les trois premiers caractères. Pour combiner des colonnes, df["first"] + " " + df["last"] associe Ana et Silva sous la forme « Ana Silva » ; str.cat est une autre méthode d’association. Chaque opération renvoie un résultat : enregistre-le donc dans la colonne que tu souhaites utiliser.

Points clés

  • Utilise .str pour appliquer des méthodes textuelles à une Series.
  • Supprime les espaces superflus et harmonise la casse avant de comparer des clés textuelles.
  • Maîtrise le résultat du découpage avec expand et n.
  • Pour les caractères spéciaux, choisis explicitement une recherche littérale ou par expression régulière.
  • Réaffecte le texte nettoyé pour conserver la modification.

3.2 Extraire les parties décrites par un motif textuel

Une expression régulière décrit un motif dans un texte. Elle peut reconnaître une quantité même lorsque le nombre de chiffres ou l’espacement varie. Commence par un petit motif dont tu peux expliquer les éléments.

Lire les éléments du motif
MotifSignification
\dUn chiffre
\wUn caractère de mot : lettre, chiffre ou trait de soulignement
\sUn caractère d’espacement
[A-Z]Une lettre majuscule de cet intervalle
+Une ou plusieurs occurrences de l’élément précédent
*Zéro ou plusieurs occurrences de l’élément précédent
?L’élément précédent est facultatif
{4}Exactement quatre répétitions
(…)Un groupe de capture

Écris les motifs Python sous forme de chaînes brutes, comme r"\d+", pour que Python conserve leurs barres obliques inverses. Par défaut, un point correspond à n’importe quel caractère sauf un saut de ligne. Échappe-le sous la forme r"\." pour trouver un vrai point. Pour une recherche de texte littéral, regex=False évite entièrement l’interprétation du motif.

Choisir la portion de texte qui doit correspondre

contains trouve un motif n’importe où, match commence au début et fullmatch exige que la valeur entière corresponde. Pour « 123a », s.str.contains(r"\d+") et s.str.match(r"\d+") réussissent, mais s.str.fullmatch(r"\d+") échoue. Utilise le test sur la chaîne entière pour vérifier un code complet. case=False ou flags=re.IGNORECASE après import re permet une recherche sans distinction de casse là où ces options sont prises en charge.

Capturer une mesure

Prends « Rice 5 kg », « Flour 2kg », « Salt » et « Beans 12 kg, 3 kg ». Le motif r"(\d+)\s*kg" signifie un ou plusieurs chiffres capturés dans un groupe, suivis de zéro ou plusieurs espaces puis de « kg ».

quantity = s.str.extract(r"(\d+)\s*kg", expand=False)
quantity = pd.to_numeric(quantity)

Les chaînes extraites sont « 5 », « 2 », une valeur manquante et « 12 ». La conversion donne les valeurs numériques 5.0, 2.0, NaN et 12.0. extract prend la première correspondance de chaque ligne, donc la deuxième quantité dans la description des haricots n’est pas incluse. Sans expand=False, un seul groupe renvoie un DataFrame à une colonne.

Les groupes nommés donnent des étiquettes aux sorties. s.str.extract(r"(?P<year>\d{4})-(?P<month>\d{2})") trouve « 2024-03 » dans « Report 2024-03 final » et renvoie les colonnes textuelles year et month. Le motif reconnaît la disposition des chiffres ; la conversion numérique est une étape distincte.

Trouver toutes les correspondances ou nettoyer à l’aide d’un motif

findall(r"\d+") donne une liste par ligne, notamment ["12", "3"] pour le texte sur les haricots et [] pour « Salt ». count(r"\d+") compte les correspondances. extractall donne une ligne par correspondance avec un niveau d’index supplémentaire nommé match.

Avec regex=True, s.str.replace(r"\s+", " ", regex=True) réduit les suites de caractères d’espacement à un seul espace. r"\D" désigne un caractère qui n’est pas un chiffre ; le supprimer transforme donc « +351 912-345-678 » en « 351912345678 ». Les formes majuscules \S et \W désignent de même les caractères qui n’appartiennent pas respectivement aux classes des caractères d’espacement et des caractères de mot.

La répétition est gloutonne par défaut. Dans "<b>x</b>", r"<.*>" va du premier symbole ouvrant au dernier symbole fermant. Supprimer cette correspondance supprime tout. Le motif non glouton r"<.*?>" correspond à chaque balise séparément et laisse « x ». Vérifie des exemples de résultats avant d’utiliser un motif sur toute une colonne.

Points clés

  • Utilise des chaînes brutes pour conserver les barres obliques inverses des expressions régulières.
  • Choisis contains, match ou fullmatch selon la portion de texte visée.
  • Les groupes de capture renvoient du texte ; convertis séparément les nombres extraits.
  • extract prend la première correspondance ; findall et extractall conservent plusieurs correspondances.
  • Échappe les caractères spéciaux pour les rechercher littéralement dans une expression régulière.
  • Vérifie les motifs gloutons sur des exemples comportant plusieurs correspondances possibles.

3.3 Stocker les étiquettes répétées sous forme de catégories

Une colonne contenant peu de valeurs répétées de nombreuses fois peut utiliser le type category. Celui-ci stocke les étiquettes distinctes une seule fois et représente chaque ligne par un petit code entier. La valeur visible reste l’étiquette.

Comprendre les catégories et les codes

Pour les tailles M, S, L, M, M, s.astype("category") infère les catégories L, M, S par ordre alphabétique. Les codes sont 1, 2, 0, 1, 1. Utilise s.cat.categories pour examiner les étiquettes et s.cat.codes pour examiner les identifiants. Un code de 0 désigne la première catégorie stockée ; ce n’est pas une quantité mesurée.

Les étiquettes répétées peuvent permettre d’économiser beaucoup de mémoire. Jusqu’à 126 catégories, les codes occupent chacun un octet ; à partir de 127 catégories, ils occupent deux octets. Dans une configuration pandas 3.1 avec PyArrow, trois noms de pays répétés sur 3 000 000 de lignes occupaient environ 3 Mo sous forme de données catégorielles, environ 42 Mo en str et environ 165 Mo en object. Le moteur de stockage du texte influe sur ces chiffres. Une colonne dont les valeurs sont presque toutes uniques ne tire aucun avantage du stockage d’une liste de catégories et d’un code par ligne.

Définir un ordre qui a un sens

L’ordre alphabétique des tailles place L avant M, puis S. Définis explicitement l’ordre réel des tailles :

size_type = pd.CategoricalDtype(["S", "M", "L"], ordered=True)
sizes = s.astype(size_type)

Le tri suit maintenant l’ordre S, M, L, les comparaisons comme sizes > "S" ont un sens, et sizes.max() vaut « L » lorsque L est présent. Pour des étiquettes non ordonnées comme les pays, les tests d’égalité fonctionnent, mais les comparaisons de supériorité déclenchent une TypeError. as_ordered() utilise la séquence existante des catégories ; examine-la avant de considérer que cet ordre a un sens.

Modifier les étiquettes autorisées

Tu ne peux pas affecter « XL » à une colonne catégorielle qui n’autorise que S, M et L. Affecte d’abord le résultat enrichi, sizes = sizes.cat.add_categories("XL"), puis affecte la nouvelle valeur.

Convertir du texte vers une liste fixe de catégories peut transformer les valeurs absentes de la liste en valeurs manquantes. pandas 3.1 avertit que cette conversion avec perte deviendra une erreur. Vérifie les valeurs sources avec value_counts() avant la conversion, en particulier après avoir nettoyé les graphies.

Les méthodes .cat ont des fonctions différentes :

  • rename_categories({"S": "small"}) modifie une étiquette tout en conservant ses éléments.
  • remove_categories("L") supprime une étiquette autorisée et rend manquantes les valeurs L existantes.
  • set_categories([...]) remplace toute la liste des catégories.
  • reorder_categories([...], ordered=True) modifie l’ordre sans changer les étiquettes autorisées.
  • remove_unused_categories() supprime les étiquettes auxquelles aucun élément n’appartient actuellement.

value_counts() affiche toutes les catégories autorisées, y compris celles qui ne comptent aucune observation. Avec un type S/M/L contenant uniquement S et M, L apparaît tout de même avec un effectif de 0. Cela fait apparaître un groupe vide dont les données textuelles ordinaires ne stockent pas l’étiquette.

Garder les catégories utiles pour la suite

cut produit des intervalles catégoriels, et get_dummies convertit l’appartenance aux catégories en colonnes indicatrices. Fournir à un modèle les codes de pays non ordonnés sous forme de nombres imposerait un ordre et des distances artificiels. Les indicatrices évitent cette interprétation.

La concaténation de colonnes catégorielles dont les listes de catégories diffèrent fait normalement perdre le type catégoriel. Harmonise d’abord leurs listes de catégories ou utilise pd.concat(..., union_categories=True) dans pandas 3.1 lorsque tu souhaites réunir les listes. Examine à la fois le type obtenu et l’ordre des catégories.

Points clés

  • Les colonnes catégorielles stockent une liste d’étiquettes et des identifiants entiers.
  • Définis explicitement l’ordre des catégories lorsqu’un classement a un sens.
  • Ajoute une catégorie avant d’affecter une nouvelle étiquette.
  • Supprimer une catégorie utilisée rend ses valeurs manquantes.
  • Utilise des indicatrices pour les catégories non ordonnées dans les modèles numériques.
  • Harmonise les listes de catégories ou réunis-les volontairement avant la concaténation.
4

Combiner des DataFrame

Combiner des tables peut ajouter des informations, ajouter des observations ou compléter des valeurs manquantes depuis une source de secours. Ce sont des tâches différentes. Fais correspondre des clés explicites avec merge, utilise les étiquettes d’index avec join et combine_first, et empile des parties compatibles avec concat. Avant de te fier à un résultat, prévois quelles lignes doivent être conservées et combien de correspondances chaque clé doit produire ; les exemples montrent pourquoi une augmentation inattendue commence souvent par une clé de correspondance répétée.

4.1 Prévoir ce qu’une fusion conservera

Une fusion fait correspondre des lignes à l’aide de valeurs de clé et place leurs informations côte à côte. La clé doit désigner la même chose dans les deux tables, comme l’identifiant du client sur une commande et l’identifiant du client dans une table de correspondance.

Nommer la clé et choisir la jointure

Utilise orders.merge(customers, on="customer_id"). Sans on, pandas utilise tous les noms de colonnes communs aux deux tables. Une colonne commune sans rapport comme date pourrait alors empêcher des correspondances valides entre clients.

Supposons que les commandes portent les identifiants de clients 10, 20, 20, 30, 50. La table des clients contient une ligne pour chacun des identifiants 10, 20, 30, 40.

howCe qui est conservéNombre de lignes du résultat
"inner"Les clés correspondantes des deux côtés4
"left"Chaque ligne de gauche et ses correspondances5
"right"Chaque ligne de droite et ses correspondances5
"outer"Les clés de l’un ou l’autre côté6
"cross"Chaque paire de lignes gauche/droite20

La jointure interne est celle par défaut. Dans une fusion à gauche, les détails du client 50 sont manquants. Une fusion à droite inclut le client 40 sans commande, ainsi que les deux commandes du client 20. Une fusion externe complète inclut les deux clés sans correspondance. Une fusion croisée n’a pas besoin de clé car elle associe volontairement toutes les lignes entre elles. pandas 3 fournit aussi left_anti et right_anti pour les lignes dont la clé n’a pas de correspondance de l’autre côté.

Vérifier le nombre de correspondances possibles par ligne

Deux lignes à gauche pour la clé 20 et trois lignes à droite pour la clé 20 produisent six paires. La fusion ne choisit pas une seule ligne de droite. Dans l’exemple, ajouter une deuxième ligne de correspondance pour le client 20 fait passer le résultat de la fusion interne de quatre à six lignes.

Indique la relation prévue avec validate :

merged = orders.merge(
    customers, on="customer_id", how="left",
    validate="many_to_one"
)

Cela autorise plusieurs commandes par client mais exige que les identifiants de clients à droite soient uniques. Une clé répétée à droite déclenche une MergeError. one_to_one exige l’unicité des deux côtés ; one_to_many l’exige à gauche. many_to_many autorise les répétitions des deux côtés et ne vérifie pas l’unicité.

Examiner les lignes sans correspondance

Une fusion externe complète avec indicator=True ajoute _merge. Ici, les effectifs sont de quatre lignes both, une ligne left_only et une ligne right_only. Ce sont des lignes, pas des clés distinctes : des commandes répétées peuvent produire plusieurs lignes both pour un même client.

Pour compter les clés distinctes sans correspondance du côté des commandes, utilise m.loc[m["_merge"] == "left_only", "customer_id"].nunique(). Examiner les lignes peut révéler des entrées manquantes dans la table de correspondance ou du texte incohérent.

Maîtriser les noms et les formats des clés

Si les clés ont des noms différents, utilise left_on="customer_id", right_on="id". Les deux colonnes clés restent disponibles. Plusieurs clés peuvent être comparées ensemble avec on=["city", "year"] ; les deux valeurs doivent concorder.

Les noms communs aux colonnes qui ne sont pas des clés reçoivent _x et _y. Choisis des suffixes explicites comme suffixes=("_order", "_ship") pour que les provenances restent claires.

Les clés doivent avoir des types de données compatibles et des valeurs égales. La valeur numérique 1 peut correspondre à la valeur numérique 1,0, mais des colonnes clés entières et textuelles peuvent déclencher une erreur de fusion. Convertis leurs formats de façon réfléchie. « ana » et « Ana » suivi d’un espace sont des textes différents ; harmonise la casse et les espaces aux extrémités avant la fusion lorsqu’ils désignent la même personne.

Les clés manquantes doivent aussi être examinées : pandas fait correspondre les clés manquantes d’un côté à celles de l’autre. Si les deux côtés contiennent plusieurs lignes de ce type, ces correspondances peuvent elles aussi se multiplier.

Points clés

  • Indique explicitement les clés de fusion.
  • Choisis le type de jointure selon les lignes sources qui doivent être conservées.
  • Des clés répétées produisent toutes les paires correspondantes.
  • Utilise validate pour vérifier la relation prévue entre les clés.
  • Utilise une fusion externe complète avec un indicateur pour examiner les lignes sans correspondance.
  • Vérifie les valeurs et les formats des clés ainsi que les suffixes avant d’utiliser le résultat.

4.2 Combiner les valeurs dont les étiquettes d’index correspondent

Un index peut contenir la clé que tu souhaites faire correspondre. pandas utilise ces étiquettes pour joindre des tables, compléter des valeurs manquantes ou additionner deux Series. La position des lignes ne détermine pas à elle seule les correspondances.

Effectuer une jointure sur les étiquettes d’index

left.join(right) fait correspondre les deux index et effectue par défaut une jointure à gauche. À l’inverse, merge effectue par défaut une jointure interne. Tu peux aussi écrire left.merge(right, left_index=True, right_index=True) lorsque les deux clés se trouvent dans l’index.

Supposons que stations possède les étiquettes d’index A, B, C et les altitudes 120, 850, 15 m. Une table de relevés possède les étiquettes d’index de stations A, B, B, D. readings.join(stations) conserve quatre lignes et ajoute les altitudes 120, 850, 850 et NaN. Les deux relevés B reçoivent tous deux l’altitude de B. Avec how="inner", seuls les trois relevés A/B sont conservés.

Si la table des relevés conserve les identifiants de stations dans une colonne ordinaire, utilise readings.join(stations, on="station"). La colonne de gauche correspond à l’index de droite. La forme équivalente avec une fusion est readings.merge(stations, left_on="station", right_index=True, how="left").

Indiquer clairement l’emplacement de la clé

set_index("station") déplace la colonne des stations dans l’index. reset_index() la rétablit comme colonne ordinaire. Ces opérations permettent de choisir une disposition qui rend la correspondance facile à examiner. left.join([t1, t2]) peut joindre en une fois plusieurs tables partageant des étiquettes d’index.

Si les deux tables jointes contiennent une colonne qui n’est pas une clé, comme source, join déclenche une ValueError sauf si tu distingues les noms. Dans pandas 3.1, écris suffixes=("_left", "_right") ; cela remplace les anciens arguments lsuffix et rsuffix. Les suffixes conservent les deux versions sans décider quelle valeur fait autorité.

Compléter les valeurs manquantes depuis une source de secours

a.combine_first(b) conserve les valeurs connues de a, remplace ses valeurs manquantes par celles de b aux étiquettes correspondantes et inclut les étiquettes présentes uniquement dans b.

Étiquetteaba.combine_first(b)
a1101
bNaN2020
c3303
dabsent4040

Le résultat conserve 1 et 3 car la première source les connaît déjà. Il utilise 20 pour remplacer la valeur manquante et ajoute l’étiquette d avec 40. Inverser l’appel change la source prioritaire. C’est utile lorsqu’une source principale doit avoir priorité sur une source de secours, même si leurs lignes sont dans des ordres différents.

Reconnaître l’alignement dans les calculs

Soit x avec a = 5 et b = 7 ; soit y avec b = 1 et c = 2. x + y donne b = 8, avec des résultats manquants pour a et c car il manque un opérande pour chacun. L’opération n’additionne pas la première valeur de x à la première valeur de y.

x.add(y, fill_value=0) fournit zéro pour le côté manquant et produit a = 5, b = 8, c = 2. Utilise cette règle lorsqu’une contribution absente doit compter pour zéro. L’alignement des étiquettes est le même principe d’organisation derrière ces opérations, mais leurs règles sur les valeurs diffèrent : join ajoute des colonnes, combine_first complète les valeurs manquantes et les calculs opèrent sur les valeurs correspondantes.

Points clés

  • join effectue par défaut une jointure à gauche sur l’index ; merge effectue par défaut une jointure interne.
  • Dans join(on="station"), la colonne de gauche correspond à l’index de droite.
  • Utilise des suffixes pour distinguer les colonnes de même nom qui ne sont pas des clés.
  • combine_first donne la priorité aux valeurs connues de l’objet qui appelle la méthode.
  • Les calculs s’alignent sur les étiquettes ; fill_value détermine le traitement des contributions manquantes.

4.3 Empiler des tables compatibles avec concat

Les fichiers mensuels contiennent généralement davantage de lignes correspondant au même type d’observation. La concaténation rassemble ces parties dans une seule table. Elle aligne les étiquettes sur l’autre axe ; elle ne recherche pas les valeurs correspondantes des clés de clients ou de commandes.

Empiler les lignes et aligner les colonnes

pd.concat([jan, feb]) empile les lignes car l’option par défaut est axis=0. Supposons que janvier contienne trois trajets avec les colonnes trip et km, tandis que février contient deux trajets avec trip, km et note. Le résultat comporte cinq lignes et trois colonnes. Les cellules note manquantes de janvier deviennent NaN.

join="outer" est l’option par défaut : elle conserve l’union des noms de colonnes. join="inner" ne conserve que les noms communs ; le résultat contient donc cinq lignes et les deux colonnes trip et km. Il inclut toujours les cinq observations ; le réglage de jointure agit sur l’autre axe.

L’ordre des colonnes dans les parties ne détermine pas la correspondance. Ce sont les noms exacts qui la déterminent. Si une partie utilise km et l’autre Km, le résultat contient deux colonnes partiellement vides. Renomme les en-têtes avant la concaténation.

Décider de la signification des étiquettes de lignes

Les index d’origine sont conservés par défaut. Avec les index de départ 0, 1, 2 et 0, 1, le résultat répète les étiquettes 0 et 1. result.loc[0] sélectionne deux lignes. Utilise ignore_index=True lorsque ces nombres n’ont pas de signification et que tu veux de nouvelles étiquettes de 0 à 4.

Lorsque la provenance compte, utilise un niveau d’index externe :

result = pd.concat(
    [jan, feb], keys=["jan", "feb"], names=["month", "row"]
)

result.loc["feb"] sélectionne maintenant les deux lignes de février. keys conserve la provenance dans un MultiIndex. Dans pandas 3, combiner keys avec ignore_index=True déclenche une ValueError ; choisis des étiquettes de provenance ou un nouvel index simple pour cette opération.

Placer les colonnes côte à côte

pd.concat([x, y], axis=1) aligne les lignes selon les étiquettes d’index. Pour x avec a = 1, b = 2 et y avec b = 3, c = 4, le résultat comporte les lignes a, b, c. La colonne x est manquante pour c et y est manquant pour a. Avec join="inner", seul b reste.

OpérationAjout selonÉtiquettes alignées selon
concat(..., axis=0)Les lignesLes noms de colonnes
concat(..., axis=1)Les colonnesLes index de lignes
merge(..., on="id")Les paires de lignes correspondantesLes valeurs de la colonne clé
Vérifier le stockage et rassembler efficacement les parties

Une colonne mélangeant des valeurs numériques et du texte peut devenir de type object. Si des données NumPy ordinaires int64 acquièrent une valeur manquante, elles deviennent float64 ; le type nullable "Int64" de pandas peut conserver des entiers avec <NA>. Harmonise les types avant de combiner les données lorsque la colonne possède un type défini.

DataFrame.append a été supprimé dans pandas 2.0. Pour de nombreux fichiers, rassemble les DataFrame dans une liste et appelle pd.concat une seule fois après la boucle. Reconstruire un résultat qui grandit à chaque itération recopie sans cesse les données accumulées et devient lent.

Vérifie que la longueur d’une concaténation de lignes est égale à la somme des longueurs des entrées. Examine ensuite les noms de colonnes, les nombres de valeurs manquantes et les types de données.

Points clés

  • La concaténation de lignes aligne les noms de colonnes et additionne les nombres de lignes des entrées.
  • join choisit les étiquettes communes ou toutes les étiquettes sur l’autre axe.
  • Utilise ignore_index pour des étiquettes sans importance ou keys pour conserver la provenance.
  • La concaténation de colonnes aligne les index de lignes.
  • Rassemble d’abord les nombreuses parties et concatène-les une seule fois.
5

Remodeler les données avec des index hiérarchiques, pivot et melt

Les mêmes mesures peuvent être disposées en lignes, en colonnes ou en niveaux d’index. Utilise un MultiIndex pour désigner les observations par plusieurs clés, puis déplace ces clés avec stack et unstack ou avec pivot et melt. Suis les étiquettes qui identifient une cellule et vérifie si elles sont uniques. Le remodelage devient ainsi prévisible et tu peux distinguer une combinaison absente d’un zéro mesuré ou d’une paire d’enregistrements qui nécessite une agrégation explicite.

5.1 Sélectionner des lignes avec plusieurs niveaux d’index

Un MultiIndex donne plusieurs étiquettes à chaque ligne. Une ligne de ventes peut être identifiée à la fois par la ville et l’année, sous la forme d’un tuple comme ("Osaka", 2024). Chaque étiquette appartient à un niveau, et l’ordre de ces niveaux compte pour la sélection.

Construire et nommer l’index

df.set_index(["city", "year"]) déplace ces colonnes dans l’index. pd.MultiIndex.from_product([["Lima", "Osaka"], [2024, 2025]], names=["city", "year"]) construit toutes les combinaisons des étiquettes fournies. La concaténation avec keys ajoute également un niveau.

Pour les exemples, sales contient ces paires d’index et ces valeurs :

cityyearsales
Osaka2024120
Osaka2025135
Lima202480
Lima202595

Après la définition des deux niveaux d’index, df.index.names vaut ["city", "year"]. rename_axis(["town", "yr"]) modifie les noms des niveaux sans modifier leurs valeurs.

Sélectionner une étiquette externe ou un tuple complet

df.loc["Osaka"] sélectionne les deux lignes d’Osaka. Le niveau de la ville sélectionnée disparaît, laissant 2024 et 2025 comme index. df.loc[("Lima", 2025), "sales"] sélectionne une cellule et renvoie 95.

Une seule étiquette passée à loc est recherchée dans le niveau le plus externe. df.loc[2024] cherche donc une ville nommée 2024 et déclenche une KeyError dans cette table. Pour sélectionner une année pour toutes les villes, utilise df.xs(2024, level="year"). Cette méthode renvoie 120 pour Osaka et 80 pour Lima, avec la ville comme index restant.

Pour une sélection plus générale, df.loc[pd.IndexSlice[:, 2025], :] conserve toutes les villes pour l’année 2025. Les deux-points en première position désignent toutes les étiquettes de ce niveau ; les derniers deux-points sélectionnent toutes les colonnes.

Trier avant d’extraire des tranches d’étiquettes

La sélection d’une étiquette exacte ne nécessite pas un index entièrement trié, mais l’extraction d’une tranche d’étiquettes exige un tri approprié. Utilise df.sort_index() avant df.loc["Lima":"Osaka"]. Un MultiIndex non trié peut déclencher une UnsortedIndexError pour une telle tranche.

sort_index() trie tous les niveaux dans leur ordre actuel : les villes viennent donc en premier, puis les années au sein de chaque ville. sort_index(level="year") trie selon le niveau nommé. swaplevel("city", "year") place l’année en position externe ; fais suivre cette opération de sort_index() pour regrouper et trier la nouvelle disposition. Permuter les positions des niveaux ne trie pas les lignes à lui seul.

Replacer les étiquettes dans les colonnes

reset_index() rétablit les deux niveaux comme colonnes. reset_index(level="year") ne rétablit que l’année et laisse la ville comme index. Ces opérations permettent de préparer une table pour une fusion ou un enregistrement sans perdre ses valeurs d’identification.

Les colonnes peuvent elles aussi comporter plusieurs niveaux. Un remodelage avec des valeurs de ventes et d’effectifs peut produire les étiquettes de colonnes ("sales", 2024) et ("staff", 2025). df["sales"] sélectionne toutes les colonnes situées sous l’étiquette de niveau supérieur correspondant aux ventes.

Pour obtenir un total par ville, df.groupby(level="city")["sales"].sum() donne 175 pour Lima et 255 pour Osaka. Utilise le regroupement pour calculer cet indicateur ; l’ancien argument sum(level="city") a été supprimé dans pandas 2.0.

Points clés

  • Un tuple identifie une étiquette MultiIndex complète à travers les niveaux.
  • Une sélection loc avec une seule étiquette commence au niveau le plus externe.
  • Utilise xs ou IndexSlice pour sélectionner un niveau interne.
  • Trie l’index avant d’extraire une tranche d’étiquettes.
  • Permute les niveaux pour changer leurs rôles et réinitialise-les pour rétablir les colonnes.
  • Utilise groupby(level=...) pour calculer des indicateurs par niveau d’index.

5.2 Déplacer les étiquettes entre l’index et les colonnes

stack et unstack modifient l’emplacement des étiquettes. Les valeurs conservent leur combinaison d’identification, mais la table peut faire apparaître des combinaisons pour lesquelles aucune observation n’existait.

Empiler les étiquettes de colonnes dans l’index

Supposons qu’un DataFrame au format large ait les villes Osaka et Lima comme index et les années 2024 et 2025 comme colonnes. Osaka possède les valeurs 120 et 135 ; Lima possède 80 et 95. Nomme les axes city et year pour que leur signification reste visible.

long = wide.stack() déplace les étiquettes d’années dans un nouveau niveau d’index interne. Avec ces colonnes à un seul niveau, le résultat est une Series contenant quatre valeurs :

  • ("Osaka", 2024) donne 120.
  • ("Osaka", 2025) donne 135.
  • ("Lima", 2024) donne 80.
  • ("Lima", 2025) donne 95.

Les étiquettes de villes se répètent car chaque ville possède désormais une ligne par année. L’empilement n’a pas additionné les valeurs ni créé de mesures supplémentaires.

Désempiler un niveau d’index dans les colonnes

long.unstack() déplace le niveau d’index le plus interne, l’année, dans les colonnes et retrouve la disposition au format large. long.unstack("city") déplace la ville à la place, ce qui produit des années en lignes et des villes en colonnes. Une position numérique de niveau comme unstack(0) peut sélectionner le même niveau, mais un nom rend l’intention plus facile à lire.

OpérationDéplacement des étiquettes
stack()Un niveau de colonne devient un niveau d’index interne
unstack()Un niveau d’index devient un niveau de colonne

Si l’entrée possède des colonnes hiérarchiques, empiler un niveau peut laisser un autre niveau comme colonnes. Pour des colonnes comme ("sales", 2024) et ("staff", 2024), stack("year") renvoie un DataFrame avec des colonnes de ventes et d’effectifs. Empiler tous les niveaux de colonnes renvoie une Series.

Garder les combinaisons manquantes visibles

Supposons maintenant que la Series au format long ne contienne pas d’entrée pour Lima en 2025. Le désempilement crée une table rectangulaire ville par année et introduit donc NaN à cette position. Les valeurs entières ordinaires deviennent des nombres à virgule flottante lorsque cette cellule manquante nécessite un marqueur de valeur manquante de ce type.

unstack(fill_value=0) peut remplacer par zéro une combinaison nouvellement absente. Utilise cette option uniquement si l’absence signifie zéro, par exemple aucune vente enregistrée dans un jeu complet d’événements de vente. Une observation manquante d’un capteur est inconnue et doit rester manquante.

Dans pandas 3, stack() conserve les cellules manquantes. Empiler la table incomplète de 2 × 2 renvoie donc quatre entrées, dont NaN. Ajoute .dropna() si tu ne veux que les trois valeurs connues. Supprimer les valeurs manquantes modifie les combinaisons qui restent représentées : vérifie donc la longueur du résultat.

Résoudre d’abord les combinaisons en double

Le désempilement nécessite une seule valeur pour chaque combinaison complète d’index. Deux entrées étiquetées ("Lima", 2025) se disputent la même cellule de sortie et déclenchent ValueError: Index contains duplicate entries, cannot reshape.

Utilise long.index.duplicated() pour examiner les étiquettes complètes répétées, ou vérifie les colonnes clés correspondantes avant de définir l’index. Détermine si les lignes sont des copies accidentelles ou des observations distinctes qu’il faut combiner. Les supprimer ou les agréger est une décision relative aux données ; unstack ne choisit pas de règle à ta place.

Points clés

  • stack déplace les étiquettes de colonnes vers un niveau d’index interne ; unstack déplace les étiquettes d’index vers les colonnes.
  • Choisis explicitement le niveau lorsque celui par défaut n’est pas celui dont tu as besoin.
  • Les combinaisons absentes apparaissent sous forme de cellules manquantes lors du passage au format large.
  • Dans pandas 3, l’empilement conserve les valeurs manquantes sauf si tu les supprimes ensuite.
  • Chaque combinaison complète d’index doit être unique pour permettre le désempilement.

5.3 Passer du format long au format large et inversement

Au format long, des colonnes d’identification accompagnent une colonne de valeurs. Au format large, les mesures sont réparties sur plusieurs colonnes, par exemple une colonne par année. Choisis la disposition qui facilite la tâche suivante : les tables au format long conviennent au filtrage et au regroupement, tandis que les tables au format large facilitent les comparaisons côte à côte.

Pivoter des paires uniques dans des cellules

Une table au format long contenant les colonnes city, year et sales passe au format large avec df.pivot(index="city", columns="year", values="sales"). Les étiquettes de villes forment les lignes, les années les colonnes et les ventes remplissent les cellules. Cette opération équivaut à df.set_index(["city", "year"])["sales"].unstack().

Les ventes d’Osaka de 120 et 135 en 2024 et 2025 deviennent deux cellules d’une même ligne. Les valeurs 80 et 95 de Lima forment la deuxième ligne. Inverser les arguments index et columns transpose cette disposition. Omettre values pivote toutes les colonnes de données restantes et peut créer des colonnes hiérarchiques, par exemple un niveau de ventes et un niveau d’effectifs au-dessus des années.

Déterminer si les répétitions sont des erreurs ou des observations

pivot réorganise les valeurs et ne peut pas les combiner. Deux lignes pour Lima en 2025 exigeraient deux valeurs dans une même cellule de sortie et déclencheraient donc une ValueError. Compte les paires répétées avec df.duplicated(subset=["city", "year"]).sum().

Si des observations distinctes doivent être combinées, utilise pivot_table avec une agrégation choisie. Pour les valeurs 95 et 105 de Lima en 2025, sa moyenne par défaut donne 100.0. Avec aggfunc="sum", la cellule vaut 200. Si chaque paire aurait dû apparaître une seule fois, conserve pivot pour qu’il révèle une erreur dans les données au lieu de calculer un indicateur sans avertissement.

Dépivoter les colonnes de mesures en lignes

Supposons qu’un CSV fournisse les colonnes city, 2023, 2024 et 2025. Les valeurs d’Osaka sont 110, 120, 135 ; celles de Lima sont 70, 80, 95. Dépivote les colonnes d’années :

long = wide.melt(
    id_vars="city", var_name="year", value_name="sales"
)

id_vars reste en place et se répète. Chaque étiquette de colonne de mesures devient une valeur d’année ; chaque cellule devient une valeur de ventes. Deux lignes et trois colonnes de mesures produisent six lignes au format long, dont une comme Osaka, « 2023 », 110. Les cellules de mesures manquantes deviennent elles aussi des lignes, sauf si tu les supprimes ensuite.

Comme ces étiquettes de colonnes proviennent du texte CSV, les années obtenues sont du texte. Utilise long["year"] = long["year"].astype(int) avant d’effectuer des calculs avec elles. Des étiquettes de colonnes entières en entrée donneraient déjà des années entières.

Maîtriser les éléments dépivotés et rétablir la forme

value_vars=["2024", "2025"] limite le dépivotage à ces colonnes. Oublier id_vars peut dépivoter les noms de villes dans la même colonne de valeurs que les mesures. Distingue toujours les identifiants des colonnes qui contiennent les valeurs.

Sans noms explicites, la colonne de valeurs s’appelle value. La colonne des variables hérite de wide.columns.name, ou s’appelle variable si ce nom est vide. Des paramètres var_name et value_name explicites rendent le résultat plus facile à utiliser.

Pivote à nouveau les six lignes avec index="city", columns="year", values="sales" pour rétablir les trois colonnes d’années. Après le pivotement, la ville est l’index et l’axe des colonnes s’appelle year. reset_index() rétablit la ville comme colonne, et rename_axis(columns=None) supprime le nom de l’axe des colonnes. Vérifie la forme et les étiquettes avant de fusionner ou d’enregistrer la table.

Points clés

  • Le format long place les étiquettes de mesures dans les lignes ; le format large les place dans les colonnes.
  • pivot nécessite des paires ligne/colonne uniques et n’effectue aucune agrégation.
  • pivot_table combine les paires répétées à l’aide de l’agrégation choisie.
  • melt répète les identifiants et crée une ligne par cellule de mesure.
  • Vérifie les types des étiquettes de colonnes lorsqu’elles deviennent des valeurs.
  • Réinitialise les index et les noms d’axes lorsqu’une table de sortie sans index hiérarchique est nécessaire.

Préparer les données avec pandas : exemples

5 Leçons Interactives

1

Nettoyer des relevés sans perdre leur signification

16 étapes
Quantifier les valeurs manquantes, choisir un remplacement ou une suppression adaptée et traiter les enregistrements répétés à l’aide d’une petite table météorologique.
  1. 1
    IntroductionDéterminer la signification de chaque valeur manquante

    Une table météorologique contient quatre villes et deux colonnes de mesures : la température en °C et les précipitations en mm. Certains relevés sont manquants. Tu vas repérer ces valeurs manquantes, décider quelles lignes sont utilisables et distinguer un enregistrement répété d’une observation réellement différente. Le résultat utile est une table dont les valeurs restantes ont toujours la signification que tu leur attribues. Utilise import pandas as pd et import numpy as np pour le code.

  2. 2
    ExplicationReconnaître le marqueur de valeur manquante

    Une valeur manquante peut apparaître sous la forme NaN, NaT ou pd.NA, selon son type de données. None est lui aussi reconnu comme manquant.

    Utilise df.isna() pour créer un tableau booléen contenant True à chaque emplacement manquant. Une comparaison avec np.nan ne repère pas ces valeurs car NaN est différent même de lui-même. La méthode de détection permet d’effectuer la même vérification sur des colonnes numériques, textuelles et de dates et heures.

  3. 3
    ExempleCompter les valeurs météorologiques manquantes

    Lima a une température de 18 et des précipitations de 0. La température d’Oslo manque, mais ses précipitations valent 4. Pune a une température de 31 et ses précipitations manquent. Les deux relevés de Kyiv manquent. Tous les noms de villes sont connus.

    df.isna().sum() donne 0 ville, 2 températures et 2 valeurs de précipitations manquantes. df.isna().mean() donne les proportions manquantes 0, 0.5 et 0.5 car chaque colonne contient quatre entrées.

  4. 4
    Point cléDistinguer les cellules des lignes

    Kyiv possède deux cellules manquantes, tandis qu’Oslo et Pune en possèdent une chacune. Il y a quatre cellules manquantes mais seulement trois lignes concernées.

    df.isna().sum().sum() compte les cellules. df.isna().any(axis=1).sum() indique d’abord si chaque ligne comporte une valeur manquante, puis compte ces lignes. Le any appliqué par ligne évite de compter Kyiv deux fois.

  5. 5
    DéfiTrouver un code caché de valeur manquante

    Une colonne de capteur contient 0, 7, -999 et NaN. Sa documentation indique que -999 signifie que le capteur était éteint. Combien de valeurs doivent rester connues après le nettoyage ?

    ---reveal---

    Deux : 0 et 7. Remplace le code documenté -999 par un marqueur de valeur manquante, puis utilise à nouveau isna(). Zéro est ici un relevé réel. Traiter tous les zéros comme des valeurs manquantes supprimerait une valeur connue en même temps que les relevés indisponibles.

  6. 6
    ExempleConserver les lignes qui possèdent une température

    Supposons que l’analyse nécessite la température mais puisse tolérer des précipitations inconnues. Utilise clean = df.dropna(subset=["temp_c"]). Cela conserve Lima et Pune.

    Le dropna() par défaut ne conserverait que Lima car il vérifie toutes les colonnes. thresh=2 conserverait aussi Oslo, dont la ville et les précipitations sont connues. Choisis la règle qui exprime les colonnes réellement nécessaires à l’analyse.

  7. 7
    ExempleMarquer les estimations avant le remplacement

    Pour une analyse des précipitations qui conserve toutes les villes, pars des quatre lignes d’origine. Avant de remplacer les températures manquantes, enregistre df["temp_missing"] = df["temp_c"].isna().

    Les températures connues 18 et 31 ont une moyenne de 24,5. Écris df["temp_c"] = df["temp_c"].fillna(df["temp_c"].mean()) pour remplacer les deux valeurs manquantes. L’indicateur enregistré permet toujours d’identifier les relevés d’Oslo et de Kyiv comme des estimations.

  8. 8
    ConseilChoisir l’estimation selon sa signification

    Le remplacement par la moyenne utilise les relevés connus comme estimation simple, mais réduit la dispersion apparente. La médiane est moins sensible aux relevés extrêmes. Remplacer par zéro affirme autre chose : la quantité manquante était nulle.

    Un capteur de pluie éteint ne prouve pas que les précipitations étaient nulles. Utilise des valeurs de remplacement par colonne compatibles avec leurs types de données, par exemple un dictionnaire contenant des nombres pour les champs numériques et du texte pour les champs textuels.

  9. 9
    LienUtiliser l’ordre uniquement lorsqu’il apporte une information

    La propagation vers l’avant copie la dernière valeur connue dans une case manquante ; la propagation vers l’arrière utilise la valeur connue suivante. Avec 12, NaN, NaN, 15, ffill(limit=1) donne 12, 12, NaN, 15.

    L’interpolation estime quant à elle les valeurs entre des positions connues : 10, NaN, NaN, 16 devient 10, 12, 14, 16. Ces méthodes conviennent à des relevés dont l’ordre a un sens, pas à une liste de villes sans rapport.

  10. 10
    DéfiConserver les lignes utilisables sans affirmer qu’il n’a pas plu

    Trois enregistrements contiennent A/19/2, B/21/NaN et C/NaN/5 pour ville/température/précipitations. Tu dois comparer les températures et tu ne peux pas estimer les précipitations manquantes. Quelles lignes et quelles valeurs dois-tu conserver ?

    ---reveal---

    Conserve A et B en vérifiant la colonne de température avec dropna(subset=["temp_c"]). Laisse les précipitations de B manquantes. Supprimer les lignes selon toutes les colonnes ferait perdre la température utilisable de B ; remplacer ses précipitations par zéro ajouterait une mesure non justifiée.

  11. 11
    ExempleComparer les enregistrements complets

    Une table de commandes contient les identifiants 101, 102, 102, 103, 104, 104. Les deux lignes 102 sont identiques. Les deux lignes 104 diffèrent par leur poids enregistré : 0,5 kg et 0,8 kg.

    df.duplicated().sum() indique une copie supplémentaire de ligne complète. drop_duplicates() laisse cinq lignes car les enregistrements 104 différents ne sont pas des copies exactes. Les étiquettes d’index n’influent pas sur cette comparaison.

  12. 12
    ExplicationChoisir une clé et une version à conserver

    Comparer uniquement order_id marque le deuxième 102 et le deuxième 104 comme des répétitions, soit deux copies supplémentaires de clés. La question est maintenant de savoir quelle version représente chaque commande.

    keep="last" choisit la dernière dans l’ordre actuel des lignes. Pour que cela signifie la plus récente, trie d’abord selon un champ de mise à jour. keep=False supprime tous les membres des groupes répétés et écarterait donc les deux enregistrements 104.

  13. 13
    DéfiConserver l’enregistrement le plus récent

    L’article H possède les mises à jour 1, 4, 2 et les poids 3, 6, 5 kg dans cet ordre d’entrée. Comment conserver son enregistrement le plus récent et quel poids reste ?

    ---reveal---

    Trie updated par ordre croissant, puis utilise drop_duplicates(subset="item", keep="last"). La mise à jour la plus récente est 4, donc 6 kg est conservé. Conserver la dernière ligne d’entrée sans trier sélectionnerait la mise à jour 2 et garderait à tort 5 kg.

  14. 14
    ConseilStandardiser avant de vérifier l’identité

    Les clés textuelles « Lisbon » précédée d’un espace, « lisbon » et « LISBON » suivie d’un espace ne correspondent pas exactement. Supprime les espaces aux extrémités et mets-les en minuscules lorsque ces graphies désignent la même ville. Examine ensuite les clés répétées.

    L’objectif de la table détermine si une répétition est valide : de nombreuses commandes peuvent partager un client, mais une table de correspondance censée fournir une ligne de détails par client nécessite des clés uniques. Supprimer des commandes valides ne peut pas corriger une clé répétée dans la table de correspondance.

  15. 15
    DéfiRelier le nettoyage du texte au choix des enregistrements

    Des enregistrements de clients ont pour clés « emi » entourée d’espaces et « EMI », pour mises à jour 2 et 5, et pour soldes 10 et 14. L’ancien solde est manquant dans un troisième enregistrement sans rapport. Tu as besoin de l’enregistrement le plus récent par client. Que faut-il faire avant tout remplacement de solde manquant ?

    ---reveal---

    Standardise les clés, trie par mise à jour et conserve la dernière ligne par clé nettoyée. Les deux graphies de Emi deviennent un seul client avec un solde de 14. Résous d’abord l’identité des enregistrements pour que les versions obsolètes n’influent pas sur une statistique de remplacement ultérieure.

  16. 16
    RécapitulatifVérifier le résultat par rapport à la décision

    Après le nettoyage, compare le nombre de lignes, le nombre de valeurs manquantes et l’unicité des clés au résultat attendu. Un indicateur de valeurs manquantes rend les estimations visibles ; une recherche de doublons par clé après tri permet de voir la version d’enregistrement choisie.

    Enregistre les objets renvoyés par affectation directe. Avec la copie à l’écriture de pandas 3, un appel inplace chaîné sur une colonne sélectionnée ne modifie pas son DataFrame parent.

2

Transformer des codes et des mesures

15 étapes
Choisir des remplacements exacts, des mises en correspondance, une conversion, des classes, des valeurs mises à l’échelle et des indicatrices selon le résultat recherché.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisir la signification du résultat
  2. 2
    ExempleTraduire ou modifier une valeur
  3. 3
    ExempleConvertir le texte après avoir nettoyé son format
  4. 4
    Point cléDistinguer les en-têtes des cellules
  5. 5
    DéfiTrouver l’origine d’une nouvelle valeur manquante
  6. 6
    ExempleLire les bornes d’un intervalle
  7. 7
    ExplicationInclure volontairement la borne inférieure
  8. 8
    LienChoisir les amplitudes ou les effectifs
  9. 9
    DéfiTester la règle des bornes
  10. 10
    ExempleSoustraire le minimum avant de diviser
  11. 11
    ExempleMesurer la distance à la moyenne
  12. 12
    ConseilÉcrêter sans supprimer une observation
  13. 13
    ExplicationReprésenter l’appartenance aux catégories
  14. 14
    DéfiExpliquer une ligne d’indicatrices toutes fausses
  15. 15
    RécapitulatifVérifier la représentation créée
3

Transformer du texte incohérent en étiquettes utiles

17 étapes
Nettoyer des noms, extraire des quantités de descriptions et préserver la signification des étiquettes de catégories et de leur ordre.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDonner au texte une structure cohérente
  2. 2
    ExplicationAppliquer une méthode à chaque chaîne
  3. 3
    ExempleDécouper uniquement là où le format l’exige
  4. 4
    ConseilConserver une recherche de texte littérale
  5. 5
    DéfiPréparer une clé textuelle de fusion
  6. 6
    ExplicationConstruire un motif de quantité
  7. 7
    ExempleExtraire la première quantité
  8. 8
    LienChoisir toutes les correspondances lorsqu’une seule ne suffit pas
  9. 9
    DéfiRefuser une correspondance partielle de code
  10. 10
    ConseilLimiter la portion de texte capturée par un motif
  11. 11
    ExempleDistinguer la liste des étiquettes de ses codes
  12. 12
    ExplicationDonner aux tailles l’ordre voulu
  13. 13
    ConseilPréparer l’ajout d’une nouvelle étiquette
  14. 14
    DéfiGarder les catégories vides visibles
  15. 15
    LienCombiner des catégories entre lots
  16. 16
    DéfiNettoyer avant de définir la liste autorisée
  17. 17
    RécapitulatifExaminer les valeurs textuelles et leur stockage
4

Combiner des tables et rendre compte de chaque ligne

18 étapes
Prévoir les correspondances de clés, examiner les enregistrements sans correspondance, compléter des valeurs selon leurs étiquettes et choisir quand concaténer des observations.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionChoisir la relation entre les tables
  2. 2
    ExempleNommer explicitement la clé commune
  3. 3
    ExplicationConserver le côté nécessaire
  4. 4
    Point cléPrévoir toutes les paires correspondantes
  5. 5
    ConseilTransformer la relation en règle vérifiée
  6. 6
    ExempleCompter séparément les clés sans correspondance
  7. 7
    DéfiTrouver la cause des lignes supplémentaires
  8. 8
    ExempleFaire correspondre une colonne de gauche à un index de droite
  9. 9
    ConseilDistinguer les colonnes de même nom
  10. 10
    ExempleDonner la priorité à la source principale
  11. 11
    LienSuivre les étiquettes lors de l’addition des valeurs
  12. 12
    DéfiCompléter la bonne observation
  13. 13
    ExempleAjouter des observations en faisant correspondre les noms de colonnes
  14. 14
    ExplicationConserver une étiquette de provenance ou créer un nouvel index
  15. 15
    Point cléAligner les lignes lors de l’ajout de colonnes
  16. 16
    DéfiDiagnostiquer les nouvelles distances manquantes
  17. 17
    DéfiCombiner les lots avant d’ajouter les détails de correspondance
  18. 18
    RécapitulatifRendre compte des ajouts et des correspondances
5

Remodeler les valeurs en conservant leurs étiquettes

18 étapes
Construire un MultiIndex, déplacer ses niveaux avec stack et unstack, et choisir pivot ou melt pour les formats long et large.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuivre l’identité de chaque mesure
  2. 2
    ExempleDonner deux étiquettes à une ligne
  3. 3
    ExplicationSélectionner le niveau voulu
  4. 4
    ConseilTrier après avoir modifié le rôle des niveaux
  5. 5
    DéfiSélectionner un niveau interne sans modifier les données
  6. 6
    ExempleDéplacer les colonnes d’années dans l’index
  7. 7
    ExplicationChoisir le niveau qui devient des colonnes
  8. 8
    Point cléReconnaître une valeur manquante nouvellement visible
  9. 9
    DéfiTrouver pourquoi le passage au format large échoue
  10. 10
    LienChoisir le format long ou large pour la tâche suivante
  11. 11
    ExemplePivoter une paire unique dans une cellule
  12. 12
    ExplicationAgréger uniquement lorsque c’est voulu
  13. 13
    ExempleDépivoter les mesures en conservant les identifiants
  14. 14
    ConseilVérifier le type pris par une étiquette de colonne
  15. 15
    DéfiRetrouver une cellule manquante au format large
  16. 16
    LienRétablir une table prête pour les opérations sur les colonnes
  17. 17
    DéfiChoisir le traitement des mesures répétées
  18. 18
    RécapitulatifVérifier la forme, l’unicité et la signification

Préparer les données avec pandas : QCM

50 Questions Pratiques en 5 séries

Série 1 : Lire les données et prévoir des changements simples10 Questions Pratiques

Question 1 sur 10

Une Series de nombres à virgule flottante contient 6, NaN et 12. Quelle est sa moyenne par défaut ?
  1. 6,0
  2. 18,0
  3. 12,0
  4. 9,0
Afficher la réponseMasquer la réponse
Réponse : D
La moyenne utilise les deux valeurs connues : elle additionne donc 6 et 12 puis divise par 2 pour donner 9.0. Diviser par les trois positions donne 6.0, ce qui traite l’entrée manquante comme un zéro alors qu’aucun zéro n’a été observé. len compte les positions ; la moyenne par défaut ignore les valeurs manquantes.

Question 2 sur 10

Un DataFrame possède des cellules manquantes à la ligne A/colonne x, à la ligne A/colonne y et à la ligne C/colonne x. Toutes les autres cellules sont connues. Combien de lignes df.isna().any(axis=1).sum() compte-t-il ?
  1. 3
  2. 4
  3. 1
  4. 2
Afficher la réponseMasquer la réponse
Réponse : D
Les lignes A et C contiennent chacune au moins une valeur manquante : deux lignes sont donc comptées. La ligne A ne contribue qu’une seule fois à ce test par ligne malgré ses deux cellules manquantes. Un total de trois compterait les cellules manquantes plutôt que les lignes concernées.

Question 3 sur 10

Une table contient les colonnes item, mass_kg et note. La ligne U a une masse connue et une note manquante ; la ligne V a une masse manquante et une note connue. Les deux noms d’articles sont connus. Que conserve df.dropna(subset=["mass_kg"]) ?
  1. Aucune des deux lignes
  2. La ligne V uniquement
  3. La ligne U uniquement
  4. Les deux lignes
Afficher la réponseMasquer la réponse
Réponse : C
Seule la ligne V a une valeur manquante dans la colonne vérifiée : elle est donc supprimée et U reste. Une note manquante n’a pas d’importance pour cette règle limitée à un sous-ensemble. Supprimer les deux lignes reviendrait à appliquer la vérification par défaut, plus large, à toutes les colonnes au lieu de vérifier uniquement la masse.

Question 4 sur 10

Une Series contient « A », « B » et « C ». Que produit s.map({"A": "active", "B": "blocked"}) ?
  1. « active », « blocked », « blocked »
  2. « active », « blocked », NaN
  3. « active », « blocked », « C »
  4. « A », « B », NaN
Afficher la réponseMasquer la réponse
Réponse : B
Les deux clés du dictionnaire sont associées aux sorties indiquées, et C devient manquant car le dictionnaire ne contient pas d’entrée C. Conserver le C d’origine correspond au comportement de replace avec ce dictionnaire. Un dictionnaire transmis à map définit les sorties de toute la mise en correspondance, et pas seulement des modifications de certaines valeurs.

Question 5 sur 10

Les valeurs 0, 10 et 20 sont passées à pd.cut(x, [0, 10, 20]) avec les paramètres par défaut. Où va 10 ?
  1. Il va dans (0, 10].
  2. Il appartient aux deux intervalles.
  3. Il va dans (10, 20].
  4. Il devient une valeur manquante.
Afficher la réponseMasquer la réponse
Réponse : A
Les intervalles par défaut incluent leur borne droite et excluent leur borne gauche. Dix appartient donc au premier intervalle, dont la borne droite est 10. Le placer dans le deuxième intervalle reviendrait à utiliser des intervalles fermés à gauche, ce qui nécessite right=False.

Question 6 sur 10

Une Series de villes contient « Accra » précédé d’un espace, « ACCRA » suivi d’un espace et « accra ». Après s.str.strip().str.lower(), combien reste-t-il de valeurs distinctes et de lignes ?
  1. 1 valeur distincte, 3 lignes.
  2. 3 valeurs distinctes, 3 lignes.
  3. 1 valeur distincte, 1 ligne.
  4. 2 valeurs distinctes, 3 lignes.
Afficher la réponseMasquer la réponse
Réponse : A
La suppression des espaces aux extrémités et la mise en minuscules transforment chaque entrée en « accra » : il y a donc une valeur distincte parmi les trois lignes d’origine. Le nettoyage du texte modifie les valeurs sans supprimer d’enregistrements. Un résultat à une seule ligne nécessiterait une opération supplémentaire de suppression des doublons, qui n’a pas été effectuée.

Question 7 sur 10

Un code de produit est « 72x ». Comment str.contains(r"\d+") et str.fullmatch(r"\d+") le classent-ils ?
  1. Contains est vrai ; fullmatch est faux.
  2. Les deux renvoient vrai.
  3. Contains est faux ; fullmatch est vrai.
  4. Les deux renvoient faux.
Afficher la réponseMasquer la réponse
Réponse : A
Le code contient une suite de chiffres, donc la recherche à n’importe quel endroit réussit. Le x final empêche le code entier de correspondre à un motif composé uniquement de chiffres : fullmatch échoue donc. Considérer le préfixe numérique comme une correspondance complète accepterait du texte hors du format exigé.

Question 8 sur 10

Des livraisons ont les clés de dépôt P, P, Q, R. Une table des dépôts contient les clés P, P, Q, S. Combien de lignes résulte-t-il d’une fusion externe complète sur la clé ?
  1. 8
  2. 7
  3. 6
  4. 9
Afficher la réponseMasquer la réponse
Réponse : B
Les deux lignes P de chaque côté produisent quatre paires et Q contribue une ligne correspondante. R et S ajoutent chacun une ligne sans correspondance, soit sept au total. Six omettrait l’un des côtés sans correspondance ou sous-estimerait les paires de clés répétées ; une fusion externe complète conserve les clés sans correspondance des deux côtés.

Question 9 sur 10

Le lot A de deux lignes contient les colonnes id, km. Le lot B de trois lignes contient les colonnes id, km, flag. Quelle forme résulte de pd.concat([a, b], ignore_index=True) ?
  1. 6 lignes, 3 colonnes
  2. 3 lignes, 3 colonnes
  3. 5 lignes, 3 colonnes
  4. 5 lignes, 2 colonnes
Afficher la réponseMasquer la réponse
Réponse : C
La concaténation de lignes additionne les longueurs des entrées, ce qui donne cinq lignes, et conserve l’union des noms de colonnes, ce qui donne trois colonnes. Les deux lignes A reçoivent des valeurs flag manquantes. Deux colonnes nécessiteraient join="inner" ; réinitialiser l’index ne supprime pas une colonne supplémentaire.

Question 10 sur 10

Une table au format large possède 3 lignes de stations et les colonnes station, dry et wet. Quelle longueur obtient-on en dépivotant les deux colonnes de mesures avec id_vars="station" ?
  1. 9 lignes
  2. 6 lignes
  3. 3 lignes
  4. 2 lignes
Afficher la réponseMasquer la réponse
Réponse : B
Chacune des trois lignes de stations contribue une mesure sèche et une mesure humide, ce qui produit six lignes au format long. L’identifiant de station est répété, pas dépivoté. Neuf reviendrait à traiter à tort l’identifiant comme une troisième colonne de mesures ; seules les deux colonnes de valeurs sélectionnées multiplient le nombre de lignes.
Série 2 : Choisir des méthodes pour les tâches courantes de préparation des données10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Les identifiants dans l’ordre des lignes sont K, L, L, M, M, N. Quels identifiants restent après drop_duplicates(subset="id", keep=False) ?
  1. K, N
  2. L, M
  3. K, L, N
  4. K, L, M, N
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une Series ordonnée contient 5,0 ; NaN ; NaN ; 11,0. Que produit ffill(limit=1) ?
  1. 5, NaN, 11, 11
  2. 5, 8, NaN, 11
  3. 5, 5, NaN, 11
  4. 5, 5, 5, 11
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une Series contient « 900 », « 1,600 » et « bad ». Après suppression littérale des virgules et application de pd.to_numeric(..., errors="coerce"), quelles valeurs restent ?
  1. 900, 1600, 0
  2. « 900 », « 1600 », « bad »
  3. 900, NaN, NaN
  4. 900, 1600, NaN
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une Series non constante contient 5, 15 et 25. Quelle est la valeur de 15 après normalisation min-max ?
  1. 0,0
  2. 0,6
  3. 0,5
  4. 0,4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une colonne catégorielle autorise « low » et « high ». Que faut-il faire avant de pouvoir affecter « medium » à une ligne ?
  1. Trier ses codes de catégories existants.
  2. Supprimer ses catégories inutilisées.
  3. Ajouter « medium » à ses catégories.
  4. Définir son ordre actuel comme vrai.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une Series contient « Park Rd », « Rd » et « Road ». Quel est le résultat de s.replace("Rd", "Road") ?
  1. « Park Rd », « Road », « Road »
  2. « Park Rd », « Rd », « Road »
  3. « Park Road », « Road », « Road »
  4. « Park Road », « Rd », « Road »
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Une table de capteurs possède les clés S, S, T et doit conserver toutes les observations. Sa table de correspondance possède une ligne pour S et une pour T. Quels paramètres de fusion expriment cette exigence ?
  1. how="left", validate="one_to_many"
  2. how="outer", validate="one_to_one"
  3. how="inner", validate="one_to_one"
  4. how="left", validate="many_to_one"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

La Series a contient p = 4, q = NaN ; la Series b contient q = 9, r = 2. Quel est le résultat de a.combine_first(b) ?
  1. p = 4, q = 9
  2. p = 4, q = 9, r = 2
  3. p = 4, q = NaN
  4. p = NaN, q = 9, r = 2
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une table indexée par site/mois contient les relevés 2 et 5 pour C/6, le relevé 4 pour D/6 et le relevé 9 pour C/7. Un analyste permute les niveaux, puis essaie .loc["C"] pour obtenir les totaux par site pour le mois 6. Quelle correction conserve les relevés et donne les totaux nécessaires ?
  1. Regrouper toutes les lignes par site avant de sélectionner le rapport : C = 16, D = 4.
  2. Utiliser xs("C", level="site"), puis regrouper par mois : 6 = 7, 7 = 9.
  3. Supprimer les paires site/mois répétées, puis sélectionner le mois 6 : C = 2, D = 4.
  4. Utiliser xs(6, level="month"), puis regrouper par site : C = 7, D = 4.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une Series au format long contient les relevés site/période A/1 = 2, A/1 = 4, A/2 = 5, B/1 = 3. Les deux relevés A/1 doivent être moyennés ; une combinaison absente est inconnue. Tu as besoin de toutes les combinaisons site/période dans un rapport au format large, puis d’une exportation au format long. Quel procédé convient ?
  1. Calculer la moyenne de A/1, désempiler, puis empiler et supprimer les valeurs manquantes : 3 entrées connues.
  2. Calculer la moyenne de A/1, désempiler, puis empiler : 4 entrées, dont une manquante.
  3. Conserver le premier A/1, désempiler, puis empiler : 4 entrées, dont une manquante.
  4. Calculer la moyenne de A/1, désempiler en remplaçant les valeurs manquantes par zéro, puis empiler : 4 entrées connues.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Suivre les étiquettes, les clés et les changements de forme10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Une Series contient les valeurs "", " " et None, créées directement en mémoire. Combien de valeurs s.isna().sum() compte-t-il ?
  1. 3
  2. 1
  3. 2
  4. 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Les lignes de l’article Z ont les valeurs de mise à jour 2, 5 et 3, avec respectivement les masses 8, 11 et 9 kg. Quelle masse reste après un tri croissant des mises à jour et la conservation de la dernière clé d’article en double ?
  1. 8 kg
  2. 28 kg
  3. 11 kg
  4. 9 kg
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une Series contient huit relevés distincts allant de 1 à 8. Combien de relevés entrent dans chacun des quatre groupes qcut ?
  1. 1
  2. 8
  3. 2
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Les descriptions sont « Oats 18kg, 4kg » et « Tea ». Que renvoie s.str.extract(r"(\d+)\s*kg", expand=False) suivi d’une conversion numérique ?
  1. 18 et NaN
  2. 18 et 0
  3. 22 et NaN
  4. 4 et NaN
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une colonne textuelle contient les valeurs « small », « large », « medium ». Dans pandas 3.1, elle est convertie en une colonne catégorielle fixe de catégories ["small", "large"], puis les valeurs sont comptées avec dropna=False. Quels effectifs apparaissent ?
  1. small 1, large 2, manquant 0
  2. small 1, large 1, manquant 1
  3. small 1, large 1, manquant 0
  4. small 1, large 1, medium 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Une fusion externe complète joint les clés de gauche A, A, B, D aux clés de droite A, A, A, C. Quels sont les nombres de lignes _merge pour both, left_only et right_only ?
  1. 6, 2, 1
  2. 6, 1, 1
  3. 3, 2, 1
  4. 2, 2, 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

La Series x contient a = 2, b = 6 et y contient b = 4, c = 8. Après x.add(y, fill_value=0), quelle est la somme des valeurs obtenues ?
  1. 24
  2. 12
  3. 20
  4. 10
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un index possède un niveau externe de villes et un niveau interne d’années. Après swaplevel("city", "year").sort_index(), que sélectionne .loc[2027] ?
  1. Les lignes à partir de 2027.
  2. La ligne à la position 2027.
  3. La ville portant l’étiquette 2027.
  4. Toutes les lignes de l’année 2027.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Les nombres d’événements sont N/1 = 7, N/2 = 9, S/1 = 3, sans enregistrement S/2. Le journal des événements est complet : l’absence signifie donc qu’il n’y a pas d’événement. Un rapport doit montrer chaque paire site/période et conserver cette couverture dans une exportation au format long. Quel procédé et quel résultat conviennent ?
  1. Désempiler, empiler et propager vers l’avant : 4 entrées de somme 22.
  2. Désempiler, empiler et supprimer les valeurs manquantes : 3 entrées de somme 19.
  3. Désempiler avec remplacement par zéro, puis empiler : 3 entrées de somme 19.
  4. Désempiler avec remplacement par zéro, puis empiler : 4 entrées de somme 19.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table au format long contient les valeurs 8 et 12 pour P/2026 et la valeur 6 pour Q/2026. Quel résultat obtient-on avec pivot_table, en utilisant les sites comme lignes, les années comme colonnes et l’agrégation par défaut, puis en dépivotant l’unique colonne d’année ?
  1. 2 lignes avec les valeurs 10, 6
  2. 3 lignes avec les valeurs 10, 10, 6
  3. 3 lignes avec les valeurs 8, 12, 6
  4. 2 lignes avec les valeurs 20, 6
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Diagnostiquer les changements dans une chaîne de nettoyage10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Les relevés d’une colonne numérique sont 2, 4, 30, NaN. Tu enregistres un indicateur de valeurs manquantes, puis remplaces la valeur manquante par la médiane de la colonne. Quelle valeur est utilisée et combien de valeurs de l’indicateur sont vraies ?
  1. 3 et 1
  2. 4 et 0
  3. 12 et 1
  4. 4 et 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une table contient les clés « seoul » précédée d’un espace, « SEOUL » et « busan ». Pour une même ville, leurs autres données correspondent. Après suppression des espaces aux extrémités et mise en minuscules de la clé, combien de lignes restent lorsque tous les membres des groupes de clés répétées sont supprimés ?
  1. 3
  2. 1
  3. 2
  4. 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Le texte numérique d’origine est « 5 », « none », None, « 9 ». Après to_numeric(errors="coerce"), combien de valeurs présentes à l’origine sont devenues manquantes ?
  1. 3
  2. 0
  3. 2
  4. 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Une colonne de masses contient 0, 10, 20 et un relevé inconnu. Après cut avec les bornes [0, 10, 20] et les indicatrices par défaut, deux lignes ont toutes leurs indicatrices fausses. Tu dois classer les masses valides et identifier séparément les relevés inconnus. Quelle correction convient ?
  1. Supprimer les lignes toutes fausses puis conserver les bornes d’intervalles d’origine.
  2. Passer à right=False et laisser les indicatrices de valeurs manquantes désactivées.
  3. Inclure la borne inférieure et utiliser dummy_na=True lors de l’encodage.
  4. Remplacer la masse inconnue par 0, puis appliquer cut avec include_lowest=True.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Que fait s.str.split("/", n=1, expand=True) avec « zone/aisle/bin » ?
  1. Crée 3 colonnes : « zone », « aisle », « bin ».
  2. Crée 1 colonne contenant le texte d’origine.
  3. Crée 2 colonnes : « zone », « aisle/bin ».
  4. Crée 2 colonnes : « zone/aisle », « bin ».
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Les codes sont « T.8 », « T18 » et « T.12 ». Tu dois sélectionner les codes contenant un point littéral, puis extraire leurs derniers chiffres avec r"(\d+)" et les convertir. Quelles valeurs numériques restent ?
  1. 8 et 12
  2. 8, 18, 12
  3. 18 uniquement
  4. 8 et 1
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Des expéditions ont pour clés de fournisseurs « ax » entouré d’espaces, « AX », « by ». Une table de correspondance contient « ax », « ax », « by », avec des détails différents sur ses deux lignes ax. Que faut-il résoudre avant qu’une fusion à gauche puisse fournir de manière fiable une ligne de détails par expédition ?
  1. Conserver seulement la première expédition par clé.
  2. Standardiser seulement le texte des clés d’expédition.
  3. Renommer seulement les colonnes de détails communes.
  4. Standardiser les clés et résoudre les doublons dans la table de correspondance.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

La table a possède deux lignes avec les colonnes id, km. La table b possède une ligne avec les colonnes id, Km. Après concaténation des lignes avec le traitement des colonnes par défaut, combien de cellules sont manquantes dans les deux colonnes de distances réunies ?
  1. 3
  2. 2
  3. 1
  4. 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un MultiIndex région/année contient E/2025 = 3, E/2026 = 5, W/2025 = 7, W/2026 = 11. Un rapport nécessite uniquement 2026, avec les régions en colonnes. Un analyste sélectionne .loc[2026], puis effectue un pivotement. Quelle correction sélectionne les données et produit une seule ligne de rapport ?
  1. Sélectionner xs(2025, level="year"), rétablir l’année à 2026, puis pivoter année/région : 3 et 7.
  2. Sélectionner xs(2026, level="year"), rétablir l’année à 2026, puis pivoter année/région : 5 et 11.
  3. Sélectionner xs(2026, level="year"), rétablir l’année à 2026, puis pivoter année/région : 8 et 18.
  4. Additionner par région, rétablir l’année à 2026, puis pivoter année/région : 8 et 18.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Une table possède trois sites uniques, avec les colonnes site, day et night. Une cellule de nuit est manquante. Après dépivotage des deux mesures, suppression des valeurs manquantes et pivotement inverse, quels sont le nombre de lignes au format long et le nombre de cellules manquantes au format large ?
  1. 5 lignes et 0 valeur manquante
  2. 5 lignes et 1 valeur manquante
  3. 6 lignes et 0 valeur manquante
  4. 6 lignes et 1 valeur manquante
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Raisonner sur des transformations liées10 Questions Pratiques

Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.

Question 1 sur 10

Une colonne numérique en mémoire contient 0, -99, NaN et 6. Sa documentation définit -99 comme manquant et 0 comme un relevé réel. Après nettoyage, quels sont le nombre de valeurs connues et leur moyenne ?
  1. 2 valeurs connues, moyenne 3
  2. 3 valeurs connues, moyenne 2
  3. 3 valeurs connues, moyenne -31
  4. 2 valeurs connues, moyenne 6
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Les lignes sont A/2/inconnu, B/inconnu/8, C/inconnu/inconnu, D/6/10 pour site/x/y. Conserve chaque ligne comportant au moins une mesure connue, puis remplace uniquement les valeurs manquantes de x par la moyenne de ses valeurs conservées. Quelle règle de lignes et quelle somme finale de x conviennent ?
  1. Conserver au moins 2 cellules connues par ligne ; somme de x : 8.
  2. Supprimer toute ligne avec une mesure manquante ; somme de x : 6.
  3. Conserver au moins 2 cellules connues par ligne ; somme de x : 12.
  4. Conserver au moins 1 cellule connue par ligne ; somme de x : 16.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Une Series contient les codes « a », « b » et « z ». La chaîne de traitement utilise la correspondance {"a": "4", "b": "bad"}, puis applique une coercition numérique. Quelles entrées d’origine sont finalement manquantes et pourquoi ?
  1. Seulement b, car bad n’est pas numérique.
  2. b et z, par échec de conversion et de correspondance.
  3. Seulement z, car sa clé est absente.
  4. a et b, par mise en correspondance de texte numérique.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Les mesures d’origine sont 3, 9, 21, 45. Une colonne transformée contient 0, environ 0,333, 1, 1 dans le même ordre. Quelle séquence d’opérations explique le résultat tout en conservant chaque ligne ?
  1. Écrêter à 21, puis appliquer la normalisation min-max à la colonne écrêtée.
  2. Diviser par 45, puis écrêter les valeurs mises à l’échelle à 1.
  3. Écrêter à 21, puis diviser la colonne écrêtée par 21.
  4. Appliquer la normalisation min-max à la colonne d’origine, puis écrêter à 1.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Une colonne catégorielle non ordonnée contient des étiquettes de pays et possède des codes entiers. Un modèle interprète les entrées numériques comme des quantités. Pourquoi faut-il remplacer ces codes par des indicatrices de catégories ?
  1. Les codes ne peuvent pas être stockés dans des colonnes numériques.
  2. Les indicatrices créent un classement correct des pays.
  3. Les codes imposeraient un ordre et des distances inventés.
  4. Les codes occupent plus de mémoire que toutes les valeurs textuelles.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Des expéditions ont les clés U, U, V, W. Une table de correspondance des fournisseurs contient U/mise à jour 1, U/mise à jour 4, V/mise à jour 2, X/mise à jour 2. Tu as besoin des détails les plus récents par fournisseur, de conserver chaque expédition et de compter les clés distinctes sans correspondance dans les deux sources. Quel procédé convient ?
  1. Conserver les clés de correspondance les plus récentes ; vérifier par fusion externe complète ; la fusion interne donne 3 lignes et 2 clés sans correspondance.
  2. Conserver les clés de correspondance les plus récentes ; vérifier par fusion interne ; la fusion à gauche donne 4 lignes et 0 clé sans correspondance.
  3. Conserver une expédition par clé ; vérifier par fusion externe complète ; la fusion à gauche donne 3 lignes et 2 clés sans correspondance.
  4. Conserver les clés de correspondance les plus récentes ; vérifier par fusion externe complète ; la fusion à gauche donne 4 lignes et 2 clés sans correspondance.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Les valeurs principales sont a = 5, b = NaN ; les valeurs de secours sont a = 50, b = 7, c = 9. Après primary.combine_first(backup), que changerait l’inversion de la priorité des sources ?
  1. Seul c disparaît du résultat.
  2. Seul a passe de 5 à 50.
  3. Toutes les valeurs du résultat changent.
  4. Seul b passe de 7 à manquant.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Deux DataFrame possèdent chacun les colonnes kg et count, toutes deux de type nullable "Int64". Un troisième ne possède que kg avec ce type. Après concaténation des lignes, quelle proposition décrit le mieux la colonne count obtenue ?
  1. Elle perd toutes les lignes de la troisième entrée.
  2. Elle reste de type entier nullable avec des valeurs manquantes pour la troisième entrée.
  3. Elle devient textuelle car une entrée a omis count.
  4. Elle devient de type entier ordinaire avec des zéros pour la troisième entrée.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Les enregistrements d’événements sont A/1 = 4, A/1 = 6, A/2 = 8, B/1 = 3. Le journal est complet et un rapport doit montrer chaque total par site/période, y compris les paires sans événement, puis exporter la même couverture en lignes au format long. Quel procédé donne l’exportation demandée ?
  1. Additionner les paires répétées, désempiler avec remplacement par zéro, puis empiler : 4 lignes, somme 21.
  2. Conserver la première paire répétée, désempiler avec remplacement par zéro, puis empiler : 4 lignes, somme 15.
  3. Calculer la moyenne des paires répétées, désempiler avec remplacement par zéro, puis empiler : 4 lignes, somme 16.
  4. Additionner les paires répétées, désempiler, puis empiler et supprimer les valeurs manquantes : 3 lignes, somme 21.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Les nombres d’événements connus sont A/1 = 4, A/1 = 8, A/2 = 6, B/1 = 5 ; B/2 n’a pas d’enregistrement et est inconnu. Un analyste utilise un tableau croisé dynamique par défaut, puis le dépivote en affirmant exporter les totaux des paires connues. Quel résultat corrigé et quel raisonnement conviennent ?
  1. Quatre lignes totalisant 23, car le dépivotage récupère les deux enregistrements A/1.
  2. Quatre lignes totalisant 23, car zéro peut remplacer la paire inconnue.
  3. Trois lignes totalisant 17, car la moyenne par défaut est un total par paire.
  4. Trois lignes totalisant 23, après agrégation par somme et suppression des cellules inconnues.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Tu bloques sur ton propre exercice ? Aide aux Devoirs

Mots-Clés

72 Mots-Clés, chacun avec sa définition

A

Accesseur str
L’accesseur str donne accès à des méthodes textuelles vectorisées sur une Series, permettant de nettoyer chaque chaîne non manquante ou d’y effectuer une recherche.
Utilise l’accesseur str dans s.str.lower() pour mettre une colonne entière de villes en minuscules en une expression.
Alignement des étiquettes
L’alignement des étiquettes associe les valeurs pandas selon leurs étiquettes de lignes ou de colonnes, afin que des objets ordonnés différemment puissent représenter les mêmes observations correspondantes.
Lorsque deux Series sont additionnées, l’alignement des étiquettes additionne leurs valeurs étiquetées b même si b occupe une position différente dans chaque Series.
Axe
Un axe est une direction d’un objet pandas ; la concaténation selon l’axe 0 ajoute des lignes et celle selon l’axe 1 ajoute des colonnes.
Choisis l’axe 1 pour placer deux Series de mesures côte à côte selon leurs étiquettes d’index correspondantes.

C

Caractères d’espacement
Les caractères d’espacement comprennent notamment les espaces et les tabulations, qui peuvent avoir un sens à l’intérieur d’un texte ou être indésirables autour d’une étiquette.
Un espace final rend « Lima » suivi d’un espace différent de « Lima » jusqu’à ce que les valeurs de villes soient nettoyées avec str.strip().
Catégorie inutilisée
Une catégorie inutilisée est une étiquette catégorielle autorisée qui ne compte actuellement aucune observation et reste présente dans les décomptes tant qu’elle n’est pas retirée de la liste.
Une catégorie inutilisée L apparaît avec un effectif de 0 lorsqu’une colonne de tailles ne contient actuellement que S et M.
Chaîne brute
Une chaîne brute est une forme de chaîne Python précédée de r qui conserve les barres obliques inverses pour des usages comme les motifs d’expressions régulières.
Écris un motif de chiffres sous forme de chaîne brute, r"\d+", afin que sa barre oblique inverse parvienne au moteur d’expressions régulières.
Classe
Une classe est un intervalle numérique utilisé pour regrouper des mesures, dont les bornes définies déterminent l’appartenance des valeurs situées sur celles-ci.
Avec une classe écrite (0, 10], la mesure 10 est incluse et la mesure 0 est exclue.
Classe de caractères
Une classe de caractères décrit un caractère autorisé, à l’aide d’une notation abrégée comme \d ou d’un intervalle comme [A-Z] dans un motif.
La classe de caractères [A-Z] correspond à une lettre majuscule dans un code d’inventaire avant ses chiffres.
Clé d’enregistrement
Une clé d’enregistrement est une colonne ou une combinaison de colonnes qui identifie un enregistrement réel et détermine quelles répétitions doivent être examinées.
Un identifiant de commande est une clé d’enregistrement, tandis qu’un identifiant de client peut légitimement apparaître sur plusieurs commandes distinctes.
Clé de provenance
Une clé de provenance fournie à concat devient une étiquette d’index externe qui identifie la partie d’origine de chaque ligne ou colonne.
Une clé de provenance nommée « batch_a » permet de récupérer ces lignes même lorsque les numéros de lignes internes se répètent entre les lots.
Code de catégorie
Un code de catégorie est un identifiant entier qui pointe vers une étiquette d’une liste de catégories, sans impliquer de distance mesurée entre les étiquettes.
Un code de catégorie pour un pays est un identifiant de stockage : ne le traite donc pas comme le rang numérique du pays.
Coercition
Dans to_numeric, la coercition convertit les valeurs lisibles en nombres et transforme les entrées illisibles en valeurs manquantes au lieu de déclencher une erreur.
Après une coercition, examine le texte d’origine de chaque masse nouvellement manquante pour trouver les formats non reconnus.
Colonne indicatrice
Une colonne indicatrice indique si une ligne appartient à une catégorie, généralement avec des valeurs booléennes ou des zéros et des uns pour une entrée numérique.
Une colonne indicatrice pour « blue » créée par get_dummies vaut vrai uniquement pour les lignes portant l’étiquette blue.
Combinaison manquante
Une combinaison manquante est un ensemble d’étiquettes sans observation correspondante, que le passage au format large peut faire apparaître comme une cellule manquante dans un tableau rectangulaire.
Une combinaison manquante pour une station et un mois apparaît sous la forme NaN lorsque les relevés au format long sont désempilés.
combine_first
La méthode combine_first conserve les valeurs connues d’un premier objet, remplace ses valeurs manquantes à partir des étiquettes correspondantes d’un autre objet et ajoute les nouvelles étiquettes.
Utilise combine_first pour compléter les mesures manquantes depuis une source de secours tout en conservant les valeurs connues de la source principale.
Concaténation
La concaténation place des objets pandas selon les lignes ou les colonnes tout en alignant les étiquettes sur l’autre axe, sans faire correspondre les valeurs de clés ordinaires.
La concaténation de lignes rassemble des lots successifs d’observations de colis dans une table plus longue.
Conversion de type
La conversion de type modifie la façon dont les valeurs sont stockées et interprétées, par exemple en transformant du texte composé de chiffres en nombres pour effectuer des calculs.
Une conversion de type est nécessaire avant que le texte « 7.5 » puisse être utilisé comme masse mesurée dans un calcul numérique.
Copie à l’écriture
La copie à l’écriture empêche les modifications d’un objet pandas sélectionné de modifier sans avertissement un autre objet qui partage ses données sous-jacentes.
Avec la copie à l’écriture, réaffecte une Series dont les valeurs manquantes ont été remplacées à sa colonne de DataFrame pour modifier la table parente.
Correspondance complète
Une correspondance complète exige que toute la chaîne d’entrée corresponde à un motif : un fragment valide dans une valeur plus longue ne suffit donc pas.
Une correspondance complète avec r"\d+" accepte « 204 » et refuse « 204x », même si les deux chaînes contiennent des chiffres.
Coupe transversale
Une coupe transversale sélectionne une valeur d’un niveau d’index nommé pour l’ensemble des autres niveaux, permettant de sélectionner directement un niveau interne.
Une coupe transversale pour l’année 2026 récupère cette année pour toutes les villes d’un MultiIndex ville/année.

D

Découpage de chaînes
Le découpage de chaînes sépare le texte à un séparateur choisi et produit des listes de parties ou des colonnes distinctes lorsque l’expansion est demandée.
Un découpage de chaînes sur « , » suivi d’un espace transforme « Silva, Ana » en une partie pour le nom de famille et une partie pour le prénom.
Discrétisation par quantiles
La discrétisation par quantiles répartit les mesures classées en groupes d’effectifs à peu près égaux, dont les amplitudes numériques peuvent différer.
Utilise la discrétisation par quantiles avec qcut pour comparer des groupes bas, intermédiaire et haut contenant des nombres de relevés similaires.
dropna
La méthode dropna supprime des lignes ou des colonnes selon leurs valeurs manquantes, avec des options pour sélectionner les colonnes et exiger un nombre de valeurs présentes.
Utilise dropna(subset=["mass_kg"]) lorsque les lignes utilisables doivent avoir une masse, même si un autre champ est incomplet.

É

Écrêtage
L’écrêtage remplace les mesures qui dépassent une borne choisie par cette borne elle-même, en conservant les observations mais en modifiant leurs valeurs.
Un écrêtage à 80 kg transforme une entrée de 95 kg en 80 kg ; vérifie donc d’abord si ce relevé extrême est réel.

E

Expression régulière
Une expression régulière est un motif textuel construit à partir de règles sur les caractères et de répétitions, utilisé pour tester, extraire ou remplacer du texte structuré.
Une expression régulière peut trouver une masse entière suivie de « kg » même lorsque l’espacement varie.

F

Format large
Le format large répartit les mesures sur plusieurs colonnes, en donnant souvent une ligne à chaque entité et une colonne à chaque étiquette de mesure.
Le format large place trois chiffres de ventes annuelles côte à côte pour chaque ville afin de les comparer directement entre années.
Format long
Le format long stocke les étiquettes de mesures comme valeurs dans des colonnes d’identification, avec les observations en lignes et une colonne commune de valeurs de mesures.
Le format long place la ville, l’année et les ventes dans des colonnes afin que chaque observation ville/année occupe une ligne.
Fusion
Une fusion fait correspondre les lignes à l’aide de valeurs de clés et combine leurs champs, en produisant toutes les paires correspondantes autorisées par le type de jointure choisi.
Une fusion associe une ligne de correspondance client à chaque commande dont la clé client possède une valeur correspondante.

G

Groupe de capture
Un groupe de capture délimite une partie d’une expression régulière avec des parenthèses afin que le texte correspondant puisse être renvoyé comme champ extrait.
Un groupe de capture autour des chiffres dans un motif de masse renvoie « 14 » à partir du texte « Lentils 14 kg ».

I

id_vars
L’argument id_vars identifie les colonnes à conserver lors du dépivotage et sépare les identifiants d’observations des colonnes contenant les mesures.
Définir id_vars="station" évite que les noms de stations soient mélangés aux relevés numériques créés par un dépivotage.
ignore_index
L’option ignore_index remplace les étiquettes sur l’axe de concaténation par des entiers consécutifs tout en conservant l’alignement sur l’autre axe.
Définis ignore_index=True lorsque les fichiers mensuels possèdent des numéros de lignes sans importance qui se répéteraient sinon.
Imputation
L’imputation remplace les données manquantes par des valeurs estimées ou choisies, en conservant les lignes tout en modifiant la distribution observée d’une colonne.
L’imputation par la moyenne remplace une température manquante par la moyenne des relevés connus et réduit la dispersion apparente.
Indicateur de fusion
Un indicateur de fusion marque chaque ligne du résultat selon l’origine de sa correspondance : les deux entrées, l’entrée de gauche seule ou l’entrée de droite seule.
Compte les valeurs de l’indicateur de fusion après une fusion externe complète pour repérer les lignes sans correspondance d’un côté ou de l’autre.
Interpolation
L’interpolation estime des valeurs entre des relevés connus ; l’interpolation linéaire de pandas utilise leurs positions pour estimer une évolution en ligne droite.
L’interpolation transforme les relevés ordonnés 8, NaN, 12 en 8, 10, 12 lorsqu’une estimation en ligne droite convient.

J

Jointure à gauche
Une jointure à gauche conserve chaque ligne de gauche et ses correspondances, en fournissant des champs manquants à droite lorsqu’une clé de gauche n’a pas de correspondance.
Une jointure à gauche conserve une commande dont la clé client est inconnue afin que les détails de correspondance manquants restent visibles.
Jointure externe complète
Une jointure externe complète conserve les clés présentes d’un côté ou de l’autre et affiche des champs manquants lorsqu’une clé n’a pas de ligne correspondante dans l’autre entrée.
Une jointure externe complète fait apparaître les commandes sans détails de client et les clients sans commande enregistrée.
Jointure interne
Une jointure interne conserve les paires de lignes dont les clés correspondent des deux côtés et exclut les observations dont la clé n’a pas de correspondance dans l’autre table.
Une jointure interne supprime une livraison dont l’identifiant de station n’a aucune ligne correspondante dans la table de correspondance des stations.
Jointure sur l’index
Une jointure sur l’index fait correspondre les tables par des étiquettes d’index ; join de pandas utilise l’index de droite même lorsqu’une colonne clé de gauche est indiquée.
Une jointure sur l’index peut ajouter les altitudes des stations à des relevés répétés sans les associer selon leur position de ligne.

L

Ligne en double
Une ligne en double répète une autre ligne dans toutes les colonnes comparées ; par défaut, pandas marque les copies suivantes et ignore les étiquettes d’index.
Une ligne en double avec un index numérique différent compte tout de même comme une copie lorsque toutes ses valeurs de données correspondent.

M

map
La méthode map met les valeurs d’une Series en correspondance à l’aide d’une fonction ou d’un dictionnaire ; avec un dictionnaire, les clés inconnues deviennent manquantes.
Un map de codes de pays fait apparaître les codes absents du dictionnaire sous forme de valeurs manquantes que l’analyste peut examiner.
Masque des valeurs manquantes
Un masque des valeurs manquantes est un objet booléen qui indique où les valeurs sont manquantes et possède les mêmes étiquettes et la même forme que l’objet vérifié.
Calculer la somme d’un masque des valeurs manquantes par colonne montre combien de cellules de température et de précipitations nécessitent une attention.
melt
La méthode melt transforme les colonnes de mesures en lignes d’étiquettes et de valeurs tout en conservant et en répétant les colonnes identifiées comme identifiants de lignes.
Un melt de quatre colonnes d’années crée quatre lignes par ville, y compris pour les cellules de mesures vides.
MultiIndex
Un MultiIndex identifie une ligne ou une colonne pandas avec plusieurs niveaux d’étiquettes : une étiquette complète est donc un tuple de valeurs réparties sur ces niveaux.
Un MultiIndex avec la ville et l’année identifie séparément les mesures d’une même ville pour chaque année.

N

NaN
NaN est un marqueur de valeur manquante utilisé dans les colonnes de nombres à virgule flottante et les colonnes textuelles par défaut de pandas 3 ; il est différent de lui-même dans les tests d’égalité ordinaires.
Utilise isna() pour trouver les NaN dans la colonne de température avant de compter les relevés disponibles pour une moyenne.
NaT
NaT est le marqueur pandas de valeur manquante pour les dates et les heures ; il permet à une colonne de dates et heures de représenter une date ou un horodatage indisponible.
Une date d’inspection absente apparaît sous la forme NaT, et isna() la détecte en même temps que les relevés numériques manquants.
Niveau d’index
Un niveau d’index est une composante étiquetée d’un index hiérarchique, comme la ville ou l’année, qui possède une position et éventuellement un nom.
Déplacer l’année au niveau d’index externe en fait la première étiquette utilisée par une sélection loc à une seule étiquette.
Normalisation de la casse
La normalisation de la casse donne au texte une casse cohérente afin que les versions en majuscules et en minuscules puissent être comparées comme une même étiquette.
La normalisation de la casse fait correspondre « PUNE » et « pune » avant le comptage ou la fusion de leurs enregistrements.
Normalisation min-max
La normalisation min-max soustrait le minimum d’une colonne et divise par son étendue non nulle, transformant son minimum observé en 0 et son maximum en 1.
Pour les relevés 2, 5, 8, la normalisation min-max donne 0 ; 0,5 ; 1 en utilisant l’étendue d’origine de 6.

O

Opération vectorisée
Une opération vectorisée agit sur une Series ou un tableau entier et exprime le même calcul sur les valeurs sans boucle Python par élément.
Multiplier la colonne des kilomètres par 1000 est une opération vectorisée qui produit des distances en mètres.

P

pivot
La méthode pivot passe des données du format long au format large en plaçant les paires index/colonne choisies dans des cellules et déclenche une erreur lorsqu’une paire identifie plusieurs valeurs.
Un pivot sur la station et le mois exige un relevé pour chaque cellule station/mois du résultat.
pivot_table
La méthode pivot_table combine les valeurs des paires index/colonne répétées par agrégation, en utilisant la moyenne lorsqu’aucune fonction n’est indiquée.
Utilise pivot_table avec aggfunc="sum" lorsque des expéditions distinctes doivent être additionnées dans un total quotidien.
Propagation de la dernière valeur connue
La propagation de la dernière valeur connue copie la valeur connue la plus récente dans les cases manquantes suivantes selon un ordre de lignes qui a un sens, avec une limite facultative par suite.
La propagation de la dernière valeur connue peut reporter un réglage stable d’instrument sur la ligne suivante, mais ne peut pas remplacer une valeur manquante en début de série.
Propagation de la prochaine valeur connue
La propagation de la prochaine valeur connue copie la valeur connue suivante dans les cases manquantes précédentes ; sa signification dépend donc de l’ordre des observations.
La propagation de la prochaine valeur connue utilise le relevé connu suivant pour remplacer un relevé antérieur indisponible.

R

Recherche littérale
La recherche littérale recherche les caractères exacts fournis, sans donner aux symboles spéciaux des expressions régulières, comme le point, leur signification de motif.
Utilise une recherche littérale pour supprimer le point d’un code sans le traiter comme un motif correspondant à n’importe quel caractère.
Relation plusieurs-à-un
Une relation plusieurs-à-un autorise les clés répétées à gauche mais exige des clés uniques à droite, comme plusieurs commandes correspondant à un seul enregistrement client.
Valide une relation plusieurs-à-un lorsque tu enrichis des livraisons à partir d’une table de correspondance comportant une ligne par station.
Remodelage
Le remodelage modifie la disposition des valeurs et de leurs étiquettes d’identification entre les lignes et les colonnes sans choisir lui-même une agrégation.
Le remodelage d’une Series ville/année complète en une table au format large conserve chaque valeur à sa combinaison ville/année.
rename
La méthode rename modifie les étiquettes de lignes ou de colonnes à l’aide d’une correspondance ou d’une fonction, sans toucher aux valeurs des données stockées.
Utilise rename(columns={"Weight": "mass_kg"}) pour donner un sens clair à un en-tête sans modifier ses cellules.
Répétition gloutonne
Une répétition gloutonne prend la plus grande portion de texte possible tout en permettant au reste du motif de correspondre, en couvrant parfois plusieurs séparateurs.
La répétition gloutonne dans r"<.*>" peut couvrir les deux balises et le texte situé entre elles dans une courte chaîne balisée.
replace
La méthode replace substitue les valeurs correspondant exactement à une règle tout en laissant les autres entrées inchangées, à l’aide d’un scalaire, d’une liste ou d’un dictionnaire.
Un dictionnaire replace peut remplacer « pending » par « open » sans modifier les autres valeurs de statut.
reset_index
La méthode reset_index déplace un ou plusieurs niveaux d’index dans des colonnes ordinaires et fournit un index pour la disposition restante.
Utilise reset_index(level="year") pour rétablir l’année comme colonne tout en laissant la ville dans l’index.

S

Score z
Un score z exprime la distance d’une valeur au-dessus ou au-dessous de la moyenne, divisée par l’écart-type utilisé pour cette colonne.
Un score z de -1 place un relevé à un écart-type au-dessous de la moyenne, pas dans un intervalle nommé.
stack
La méthode stack déplace un niveau d’étiquettes de colonnes dans un niveau interne de l’index des lignes et renvoie une Series ou un DataFrame selon les niveaux restants.
Appeler stack sur une table de villes avec des colonnes d’années donne des paires d’index ville/année pour les mêmes valeurs de ventes.
subset
L’argument subset limite une recherche de doublons ou une vérification des données manquantes aux colonnes indiquées, en excluant les autres colonnes de cette décision.
Utilise subset="order_id" pour détecter les clés de commandes répétées même lorsque leurs poids enregistrés diffèrent.
Suffixe
Un suffixe est un texte ajouté aux noms de colonnes communs qui ne sont pas des clés lors d’une combinaison, afin de distinguer la source de chaque colonne.
Un suffixe comme _sensor distingue une colonne de relevés d’une colonne de même nom dans une table de secours.

T

Tri de l’index
Le tri de l’index ordonne les lignes selon leurs étiquettes d’index, ce qui permet d’utiliser des tranches d’étiquettes et regroupe un MultiIndex selon l’ordre de ses niveaux.
Effectue un tri de l’index après avoir permuté les niveaux de ville et d’année afin que les lignes suivent le nouvel ordre avec l’année en premier.
Type catégoriel
Un type catégoriel stocke une liste définie d’étiquettes et un code entier par ligne, avec un ordre facultatif des étiquettes qui a un sens.
Un type catégoriel peut stocker un petit ensemble d’étiquettes de tailles de produits répétées plus efficacement que du texte répété.
Type de données nullable
Un type de données nullable stocke des valeurs d’un type donné avec un marqueur de valeur manquante, comme "Int64" pour des entiers avec pd.NA.
Un type de données nullable conserve les nombres de colis sous forme d’entiers même lorsque le nombre d’un enregistrement est inconnu.

U

Unicité
L’unicité signifie qu’aucune valeur ou combinaison de clés vérifiée ne se répète ; elle est exigée pour les tables de correspondance comportant une ligne par clé.
Vérifie l’unicité dans la table de correspondance des clients avant de joindre ses détails à une table contenant de nombreuses commandes.
Union de catégories
Une union de catégories réunit les étiquettes autorisées par des entrées catégorielles afin que leur concaténation puisse conserver une sortie catégorielle malgré des listes différentes.
Utilise une union de catégories lorsque deux lots autorisent des couleurs différentes et que la colonne combinée doit conserver les deux listes.
unstack
La méthode unstack déplace un niveau de l’index des lignes dans les colonnes et exige des étiquettes d’index complètes et uniques pour placer une valeur dans chaque cellule de sortie.
Utilise unstack("year") pour placer chaque année dans une colonne de ventes distincte pour chaque ville.

V

Valeur manquante
Une valeur manquante représente une observation inconnue ou indisponible à l’aide d’un marqueur reconnu par pandas à la place d’une donnée ordinaire.
Une valeur manquante dans rain_mm signifie que le relevé est indisponible ; il faut donc la distinguer d’une absence de pluie.
Variable catégorielle ordonnée
Une variable catégorielle ordonnée possède une séquence déclarée d’étiquettes qui détermine le tri et les comparaisons d’ordre à la place de l’ordre alphabétique.
Une variable catégorielle ordonnée avec S, M, L place les tailles dans l’ordre voulu lorsque la colonne est triée.

À propos de cette unité

Par StudeliSignaler une erreur

Crée ton propre Matériel d'Étude

Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.

Commencer