Débuter avec pandas

Apprends à manipuler des tableaux de données en Python avec pandas. Construis des objets Series et DataFrame, charge un fichier CSV et vérifie les données chargées, puis sélectionne précisément les lignes et les colonnes dont tu as besoin par étiquette avec loc et par position avec iloc. Filtre les lignes selon des conditions, ajoute et transforme des colonnes, trie les valeurs et attribue-leur des rangs, puis décris les données à l’aide de statistiques descriptives, d’effectifs par valeur et de corrélations. Les exemples suivent pandas 3.

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

Ce que tu vas apprendre

  1. Décrire comment pandas stocke des données étiquetées à une ou deux dimensions, construire des objets Series et DataFrame à partir de données Python et gérer leurs étiquettes de lignes et de colonnes.
    • Créer un objet Series et utiliser son index
      Construire un objet Series à partir d’une liste ou d’un dictionnaire, lire ses valeurs, son index, son type de données et son nom, et prévoir le comportement des étiquettes dans les calculs et les recherches.
    • Construire un DataFrame et comprendre sa structure
      Créer un DataFrame à partir de données Python, lire sa forme, ses colonnes, son index et ses types de données, sélectionner une colonne sous forme d’objet Series et utiliser correctement l’argument axis.
    • Définir, réinitialiser, renommer et supprimer des étiquettes
      Choisir un index de lignes qui a un sens, le replacer dans une colonne, renommer et supprimer des lignes ou des colonnes, et conserver les résultats par réaffectation.
  2. Lire un fichier CSV dans un DataFrame avec les options appropriées, examiner systématiquement le résultat et convertir les colonnes vers les types nécessaires à l’analyse.
    • Lire un fichier CSV avec read_csv
      Charger un fichier à valeurs séparées par des virgules avec pd.read_csv, comprendre comment pandas déduit les types des colonnes et utiliser les options relatives aux séparateurs, aux décimales, aux en-têtes, aux valeurs manquantes et aux identifiants.
    • Examiner un nouveau DataFrame
      Vérifier un tableau qui vient d’être chargé avec head, info, shape, dtypes, le nombre de valeurs manquantes et le nombre de valeurs distinctes avant de l’analyser.
    • Convertir les colonnes vers les types appropriés
      Modifier le type d’une colonne avec astype, pd.to_numeric et pd.to_datetime, puis conserver la colonne convertie en la réaffectant.
  3. Sélectionner précisément les lignes, les colonnes et les valeurs individuelles nécessaires avec loc (étiquettes) et iloc (positions), et prévoir la forme et le type de chaque résultat.
    • Sélectionner des lignes et des colonnes par étiquette avec loc
      Utiliser df.loc[rows, columns] avec des étiquettes individuelles, des listes, des tranches à bornes incluses et des masques booléens, et reconnaître une étiquette inexistante.
    • Sélectionner par position avec iloc et choisir l’indexeur approprié
      Utiliser df.iloc[rows, columns] avec des positions entières, des tranches à borne finale exclue et des positions négatives, lire des valeurs individuelles avec at et iat, et choisir entre une sélection par étiquette et une sélection par position.
  4. Conserver uniquement les lignes qui remplissent une ou plusieurs conditions, à l’aide de masques booléens, de méthodes utilitaires pour les tests courants et de query, puis modifier correctement les valeurs des lignes sélectionnées.
    • Filtrer avec des masques booléens
      Construire un masque True/False à partir d’une comparaison, combiner des conditions avec &, | et ~, compter les correspondances et comprendre le comportement des valeurs manquantes dans les comparaisons.
    • Utiliser des méthodes utilitaires et query pour les filtrages courants
      Filtrer avec isin, between, isna/notna et str.contains, et écrire les mêmes conditions sous forme d’une chaîne query lisible.
    • Modifier correctement les valeurs des lignes sélectionnées
      Mettre à jour les valeurs des lignes qui remplissent une condition avec une seule affectation loc, et éviter l’affectation chaînée, qui ne modifie pas le tableau d’origine dans pandas 3.
  5. Créer des colonnes à partir de colonnes existantes avec des calculs vectorisés et assign, puis recoder ou transformer des valeurs avec np.where, map, apply et replace.
    • Calculer de nouvelles colonnes à partir des colonnes existantes
      Ajouter ou remplacer une colonne par un calcul vectorisé, utiliser assign pour construire des colonnes dans un enchaînement de méthodes et prévoir l’effet des valeurs manquantes et de l’alignement des index sur le résultat.
    • Recoder et transformer des valeurs avec np.where, map et apply
      Transformer des conditions en étiquettes avec np.where, mettre des valeurs en correspondance avec map et replace, appliquer ses propres fonctions avec apply et privilégier les formes vectorisées lorsqu’elles existent.
  6. Ordonner les lignes selon une ou plusieurs colonnes, attribuer des rangs avec une règle adaptée aux ex æquo, calculer des statistiques descriptives pour les colonnes numériques et textuelles, compter les valeurs et mesurer les liaisons.
    • Trier les lignes selon les valeurs ou l’index
      Trier un DataFrame selon une ou plusieurs colonnes dans l’un ou l’autre sens, contrôler la place des valeurs manquantes et des ex æquo, et trouver les lignes contenant les plus grandes ou les plus petites valeurs.
    • Attribuer des rangs aux valeurs et traiter les ex æquo
      Attribuer à chaque valeur son rang avec rank, choisir une méthode de traitement des ex æquo adaptée à l’objectif et exprimer les rangs sous forme de rangs centiles.
    • Décrire les colonnes à l’aide de statistiques descriptives
      Calculer les effectifs, les totaux, les indicateurs de tendance centrale, la dispersion et les quartiles avec les méthodes de pandas et describe, les interpréter et traiter correctement les valeurs manquantes et les colonnes textuelles.
    • Compter les valeurs et mesurer les liaisons
      Compter les occurrences de chaque valeur, lister les valeurs distinctes, exprimer les effectifs sous forme de proportions et mesurer la liaison linéaire entre deux colonnes numériques à l’aide de la corrélation.

Débuter avec pandas : cours

6 chapitres

1

Comprendre les objets Series et DataFrame

Les étiquettes transforment une suite de nombres en données que tu peux identifier et combiner. Construis un objet Series pour une variable et un DataFrame pour plusieurs variables, puis lis leurs dimensions et leurs types. Tu verras pourquoi la correspondance des étiquettes compte dans les calculs, en quoi une colonne diffère d’un tableau à une colonne et comment le choix, la réinitialisation ou le renommage d’un index modifie les recherches ultérieures. Ces structures servent à toutes les sélections et à tous les calculs qui suivent.

1.1 Créer un objet Series et utiliser son index

Un objet Series associe une suite de valeurs à des étiquettes. Ces étiquettes donnent un sens aux valeurs : un relevé de pluie appartient à un jour et une population à une ville. Importe pandas et NumPy sous leurs noms abrégés habituels.

import pandas as pd
import numpy as np
rain = pd.Series([4.5, 3.0, 6.2],
                 index=["Mon", "Tue", "Wed"], name="rain_mm")
Lire les valeurs et les étiquettes

Les valeurs sont 4,5 ; 3,0 et 6,2 ; l’index est composé de Mon, Tue et Wed. Sans index=, pandas fournit les étiquettes 0, 1 et 2. Un dictionnaire fournit les deux à la fois : pd.Series({"Lima": 10, "Oslo": 5, "Pune": 7}) tire ses étiquettes des clés, dans l’ordre du dictionnaire.

Les attributs décrivent l’objet Series sans parenthèses : rain.index contient les étiquettes, rain.dtype vaut float64, rain.name vaut "rain_mm" et rain.size vaut 3. Utilise rain.to_numpy() lorsqu’un tableau NumPy est nécessaire. L’ancien attribut .values renvoie différents types de tableaux selon le type de données ; les données textuelles peuvent donner un tableau pandas.

Un type de données indique à pandas quel genre de valeurs il stocke. Les types courants sont int64 pour les entiers, float64 pour les nombres décimaux, bool pour True/False, str pour le texte et datetime64 pour les dates et les heures. pandas 3 déduit le type str pour le texte ; les anciens exemples affichent souvent object.

Agir sur tout l’objet Series

Pour s = pd.Series([10, 20, 30], index=["a", "b", "c"]), s * 2 produit les valeurs 20, 40 et 60. s > 15 produit False, True et True. Les deux conservent les étiquettes. Ces opérations sont vectorisées : une expression agit sur tout l’objet Series sans boucle Python.

Recherche une étiquette avec s["b"], qui donne 20. Recherche une position avec s.iloc[0], qui donne 10. L’expression "b" in s vérifie l’index ; 20 in s vaut False. Même un entier entre crochets est une étiquette : avec l’index [2, 0, 1], s[0] désigne l’étiquette 0 et non la première entrée. Avec des étiquettes textuelles, s[0] déclenche une KeyError dans pandas 3.

Faire correspondre les étiquettes dans les calculs
a = pd.Series([1, 2, 3], index=["x", "y", "z"])
b = pd.Series([10, 20, 30], index=["y", "z", "w"])
a + b

L’étiquette commune y associe 2 et 10 pour donner 12.0 ; z associe 3 et 20 pour donner 23.0. Les étiquettes w et x n’apparaissent que dans une seule entrée et reçoivent donc NaN. Le résultat contient les quatre étiquettes. Une addition selon la position visuelle des lignes donnerait à tort 11, 22 et 33.

Utilise a.add(b, fill_value=0) lorsqu’une valeur absente doit compter pour zéro. Les résultats sont w 30.0, x 1.0, y 12.0 et z 23.0. Les méthodes apparentées comprennent sub, mul et div.

Reconnaître les valeurs manquantes

Une valeur flottante ou str manquante utilise NaN ; une date ou heure manquante utilise NaT ; un entier nullable manquant utilise <NA>. pd.Series([1, None, 3]) devient float64 et affiche 1.0, NaN et 3.0, car le type int64 ordinaire ne peut pas contenir NaN.

Points clés

  • Un objet Series associe une suite de valeurs à un index, un type de données et un nom facultatif.
  • Utilise une étiquette pour une recherche par étiquette et iloc pour une position ; les tests d’appartenance vérifient les étiquettes.
  • Les calculs vectorisés agissent sur chaque valeur tout en conservant l’index.
  • Deux objets Series s’alignent par étiquette ; les étiquettes sans correspondance donnent des résultats manquants, sauf si une valeur de remplacement est fournie.
  • Les marqueurs de valeurs manquantes dépendent du type de données : NaN, NaT ou <NA>.

1.2 Construire un DataFrame et comprendre sa structure

Un DataFrame est un tableau à deux dimensions. Chaque ligne représente une observation, comme une commande ; chaque colonne contient une variable, comme une quantité. Les colonnes peuvent avoir des types de données différents, mais elles partagent le même index de lignes.

Construire un tableau à partir de données Python
df = pd.DataFrame({
    "product": ["Notebook", "Desk lamp", "Pen set", "Mug"],
    "quantity": [3, 1, 2, 4],
    "unit_price": [2.50, 18.00, 4.75, 6.00]
})

Chaque clé du dictionnaire devient un nom de colonne ; chaque liste fournit les valeurs de cette colonne. Les listes doivent avoir la même longueur afin que chaque ligne ait une place dans chaque colonne. Ici, les étiquettes d’index vont de 0 à 3. Des listes de longueurs différentes déclenchent une ValueError.

Une liste de dictionnaires fournit quant à elle un dictionnaire par ligne. pd.DataFrame([{"a": 1, "b": 2}, {"a": 3, "c": 4}]) crée les colonnes a, b et c. La valeur b absente de la deuxième ligne et la valeur c absente de la première deviennent NaN : ces colonnes utilisent donc le type float64. Un tableau NumPy à deux dimensions peut aussi fournir les valeurs, avec columns=[...] pour nommer les colonnes.

Lire les dimensions du tableau

df.shape vaut (4, 3) : quatre lignes et trois colonnes, dans cet ordre. len(df) vaut 4, tandis que df.size vaut 12, car il compte les cellules. df.index contient les étiquettes de lignes, df.columns celles des colonnes et df.dtypes donne un type de données par colonne. Ce sont des attributs : df.shape() essaie d’appeler un tuple et déclenche une TypeError. df.T permute les lignes et les colonnes.

Obtenir un objet Series ou conserver un tableau
SélectionRésultat
df["quantity"]Un objet Series
df[["quantity"]]Un DataFrame à une colonne
df[["product", "unit_price"]]Un DataFrame avec deux colonnes dans cet ordre

La liste intérieure demande un ensemble de colonnes. Sans elle, df["product", "unit_price"] fournit une seule clé sous forme de tuple, qui ne correspond à aucun des noms de colonnes ordinaires et déclenche une KeyError.

Les crochets fonctionnent aussi lorsque les noms contiennent des espaces ou coïncident avec des méthodes. La notation avec un point, comme df.quantity, ne fonctionne que pour les noms appropriés. Une colonne nommée size nécessite df["size"], car df.size désigne le nombre de cellules du tableau. Crée aussi les colonnes avec des crochets : df["total"] = 5 ajoute une colonne, tandis que df.total = 5 ne le fait pas.

Choisir un axe

Pour numbers = pd.DataFrame({"a": [1, 2], "b": [3, 4]}), numbers.sum() additionne les valeurs en parcourant les lignes et donne a 3 et b 7. C’est axis=0, aussi appelé "index". numbers.sum(axis=1) additionne les valeurs de chaque ligne et donne 4 et 6 ; cet axe est aussi appelé "columns". Précise d’abord le résultat souhaité : un total par colonne ou un total par ligne.

Extraire une ligne crée un objet Series dont les étiquettes sont les noms des colonnes. Cet objet Series doit avoir un seul type capable de contenir toutes les cellules de la ligne. Une ligne mélangeant entiers et flottants devient float64 ; une ligne mélangeant texte et nombres devient object. Les colonnes d’origine conservent leurs types distincts.

Points clés

  • Un DataFrame possède un index de lignes partagé et un type de données par colonne.
  • Des listes de même longueur fournissent les colonnes ; une liste de dictionnaires fournit les lignes.
  • shape indique le nombre de lignes et de colonnes ; size compte les cellules.
  • Un seul nom de colonne renvoie un objet Series ; une liste de noms renvoie un DataFrame.
  • axis=0 effectue une réduction en parcourant les lignes ; axis=1 effectue une réduction en parcourant les colonnes.
  • Utilise des crochets pour les noms de colonnes qui coïncident avec des attributs ou des méthodes.

1.3 Définir, réinitialiser, renommer et supprimer des étiquettes

Les étiquettes de lignes peuvent avoir un sens, comme un numéro de commande, ou simplement désigner les lignes actuelles. Choisir un index utile rend les recherches et les résultats ultérieurs plus faciles à interpréter. Modifier les étiquettes renvoie un nouveau tableau : conserve donc le résultat avec une affectation.

Placer un identifiant dans l’index
orders = pd.DataFrame({
    "order_id": [1001, 1002, 1003],
    "product": ["Notebook", "Desk lamp", "Pen set"],
    "unit_price": [2.50, 18.00, 4.75]
})
orders_by_id = orders.set_index("order_id")

Le tableau d’origine possède un RangeIndex par défaut : 0, 1 et 2. Le nouveau tableau porte les étiquettes 1001, 1002 et 1003. order_id a quitté les colonnes pour devenir l’index. orders_by_id.loc[1002] identifie désormais la ligne Desk lamp par son identifiant.

Appeler orders.set_index("order_id") sans enregistrer son résultat laisse orders inchangé. Une réaffectation, comme orders = orders.set_index("order_id"), conserve la nouvelle structure. Dans pandas 3.1, inplace= est obsolète pour ces méthodes de modification des étiquettes et pour le tri ; utilise une affectation.

Replacer les étiquettes dans une colonne

orders_by_id.reset_index() rétablit order_id comme colonne ordinaire et fournit un nouveau RangeIndex. Un index sans nom devient une colonne appelée index. Cela conserve l’identité initiale des lignes.

reset_index(drop=True) supprime les anciennes étiquettes. Pour un index [10, 20, 30], reset_index() seul conserve ces nombres dans une colonne index ; reset_index(drop=True) les perd et utilise 0, 1 et 2. Après un filtrage ou un tri, détermine si les anciennes étiquettes sont utiles avant de les supprimer. Renuméroter l’index ne modifie pas les données et n’annule pas un tri.

Renommer ou supprimer des étiquettes
renamed = orders.rename(columns={"unit_price": "price"})
short = orders.drop(columns=["product"])
remaining = orders.drop(index=[0, 1])

rename associe les anciennes étiquettes aux nouvelles et conserve les noms non indiqués. Par défaut, un ancien nom mal orthographié est ignoré : examine donc .columns si le renommage semble n’avoir eu aucun effet. Pour remplacer tous les noms de colonnes, affecte une liste complète à orders.columns ; sa longueur doit correspondre au nombre de colonnes.

drop(columns=...) supprime des colonnes ; drop(index=...) supprime des lignes par étiquette. Une étiquette absente déclenche une KeyError. Après un tri, l’étiquette 0 peut ne plus correspondre à la première ligne : la supprimer retire toujours la ligne d’étiquette 0.

Sélectionne une liste pour choisir l’ordre des colonnes : orders = orders[["order_id", "unit_price", "product"]]. Les colonnes absentes de cette liste sont retirées du résultat.

Vérifier qu’un identifiant désigne bien une seule ligne

Les étiquettes d’index peuvent se répéter. Vérifie orders_by_id.index.is_unique avant de les considérer comme des identifiants uniques. Si l’étiquette 1002 apparaît deux fois, .loc[1002] renvoie les deux lignes sous forme de DataFrame. Avec des étiquettes uniques, la même recherche par une seule étiquette renvoie un objet Series.

Un index qui a un sens améliore aussi les indicateurs. Dans un tableau météorologique indexé par jour, weather["temp_c"].idxmax() indique un jour comme "Thu" ; avec un index par défaut, la méthode indique un numéro de ligne.

Points clés

  • set_index transforme une colonne en étiquettes de lignes ; reset_index replace les étiquettes dans une colonne.
  • reset_index(drop=True) supprime les anciennes étiquettes.
  • Conserve les modifications d’étiquettes en affectant le tableau renvoyé.
  • rename modifie les étiquettes indiquées ; drop supprime des lignes ou des colonnes par étiquette.
  • Un index peut contenir des doublons ; vérifie son unicité avant de l’utiliser comme identifiant.
2

Charger un fichier CSV et vérifier les données chargées

Un tableau chargé doit être vérifié avant que ses nombres puissent servir à une analyse. Adapte les options CSV au séparateur, à l’en-tête et aux conventions des valeurs du fichier, puis examine le résultat pour vérifier les lignes, les noms et les types attendus. Repère les entrées manquantes et les identifiants répétés, et convertis les nombres ou les dates stockés sous forme de texte si nécessaire. De petits choix d’importation comptent : un zéro initial perdu ou une date non convertie peuvent changer le sens du code exécuté ensuite.

2.1 Lire un fichier CSV avec read_csv

Un fichier CSV stocke un tableau sous forme de texte : les enregistrements occupent des lignes et un séparateur de champs sépare les champs. La première ligne contient souvent les noms des colonnes. Pour charger correctement le fichier, il faut identifier à la fois sa structure et le sens de ses valeurs.

Charger le tableau des commandes
orders = pd.read_csv("orders.csv")

Un chemin relatif est résolu à partir du répertoire de travail courant de Python. Un emplacement incorrect déclenche une FileNotFoundError. Un chemin absolu ou une URL peuvent aussi être passés à read_csv.

Les exemples utilisent ce fichier. Le champ de quantité de la dernière ligne est vide.

order_id,date,product,category,quantity,unit_price
1001,2026-03-02,Notebook,Stationery,3,2.50
1002,2026-03-02,Desk lamp,Home,1,18.00
1003,2026-03-03,Pen set,Stationery,2,4.75
1004,2026-03-04,Mug,Home,4,6.00
1005,2026-03-04,Backpack,Bags,1,35.00
1006,2026-03-05,Notebook,Stationery,,2.50

Avec les paramètres par défaut, le résultat a pour forme (6, 6) et ses étiquettes d’index vont de 0 à 5. pandas déduit les types : order_id est int64, unit_price est float64 et quantity devient aussi float64, car le champ vide devient NaN. Les autres colonnes, dont date, sont de type str. Une chaîne qui ressemble à une date reste du texte tant qu’elle n’est pas convertie.

Adapter la lecture à la structure du fichier
Caractéristique du fichierOption de lecture
Champs séparés par des points-virgulessep=";"
Virgules décimalesdecimal=","
Aucune ligne d’en-têteheader=None, names=["id", "product"]
Deux lignes supplémentaires avant l’en-têteskiprows=2
Seuls certains champs sont nécessairesusecols=["product", "quantity"]
Aperçu limiténrows=100

Pour un fichier dont les lignes sont a;b, 1,5;2 et 3,0;4, utilise pd.read_csv("file.csv", sep=";", decimal=","). La colonne a contient alors 1.5 et 3.0. Utiliser la virgule comme séparateur par défaut produit une seule colonne nommée a;b, signe qu’il faut vérifier le séparateur de champs.

index_col="order_id" transforme cette colonne en index de lignes lors du chargement. thousands="," lit un champ tel que "1,200" comme 1200 ; dans un fichier dont les champs sont séparés par des virgules, ce champ doit être mis entre guillemets selon les règles du CSV afin que sa virgule interne ne soit pas interprétée comme un autre séparateur.

Préserver le sens lors de l’inférence des types

Des codes tels que "001" sont des identifiants et non des quantités. dtype={"id": str} conserve leurs zéros initiaux. Si pandas les convertit d’abord en 1, reconvertir ce nombre en texte ne permet pas de retrouver le nombre de zéros présents dans le fichier.

Les champs vides et les marqueurs courants tels que NA, N/A, NULL, NaN et None sont considérés comme manquants par défaut. Ajoute un marqueur propre au fichier avec na_values=["-"]. Ce sont des règles de chargement : vérifie donc les conventions du fichier lorsqu’un code ressemble à un marqueur de valeur manquante.

Utilise parse_dates=["date"] pour lire les dates de l’exemple comme des dates et heures. Dans pandas 3, ces dates utilisent une résolution à la microseconde, datetime64[us]. UTF-8 est l’encodage de texte par défaut. Une UnicodeDecodeError invite à vérifier l’encodage du fichier et à fournir l’option correspondante, comme encoding="latin-1".

Points clés

  • read_csv renvoie un DataFrame et déduit les types des colonnes.
  • Adapte sep, decimal et les options d’en-tête à la structure du fichier.
  • Conserve les zéros initiaux des identifiants en utilisant un type textuel lors du chargement.
  • Les champs vides et les marqueurs courants deviennent des valeurs manquantes ; na_values ajoute des marqueurs.
  • Les dates doivent être converties, avec parse_dates lors du chargement ou par une conversion ultérieure.
  • Un chemin relatif est résolu à partir du répertoire de travail courant.

2.2 Examiner un nouveau DataFrame

Une lecture réussie signifie que pandas a pu analyser le fichier. Elle ne prouve pas que les colonnes, les types et les valeurs manquantes correspondent à ce que le tableau doit représenter. Examine le nouveau DataFrame avant d’effectuer des calculs.

Vérifier les lignes visibles et les dimensions
orders.head(3)
orders.tail()
orders.shape
orders.columns.tolist()

head() affiche cinq lignes par défaut ; head(3) en affiche trois. tail() permet de vérifier la fin, où un export peut contenir des enregistrements différents. sample(3, random_state=0) donne un échantillon aléatoire reproductible de trois lignes. Dans un notebook, la dernière expression d’une cellule s’affiche automatiquement ; utilise print ailleurs.

Le fichier de commandes doit contenir six lignes et six colonnes. Un aperçu doit montrer des colonnes nommées et la première commande parmi les données. Si le premier enregistrement apparaît parmi les noms de colonnes, le fichier n’a probablement pas d’en-tête et nécessite header=None. Si tout occupe une seule colonne large, vérifie sep.

Les noms de colonnes doivent correspondre exactement, y compris la casse et les espaces. orders["Product"] échoue lorsque le nom est product. Examiner la liste permet de repérer plus facilement les espaces finaux. orders.columns = orders.columns.str.strip() supprime les espaces aux extrémités des noms d’en-tête.

Lire la structure avec info

orders.info() affiche l’étendue de l’index, le nom, le nombre de valeurs présentes et le type de chaque colonne, ainsi que l’occupation mémoire. Dans l’exemple de six lignes, quantity comporte cinq valeurs non manquantes ; chacune des autres colonnes en comporte six. Les types sont deux colonnes de flottants, une colonne d’entiers et trois colonnes str. orders.dtypes donne une liste compacte des types.

Une colonne qui semble numérique mais qui a le type str mérite un examen : une valeur telle que "unknown", une unité comme dans "12 kg" ou un séparateur de milliers non pris en compte peuvent empêcher l’inférence d’un type numérique. Les dates restent aussi du texte tant qu’elles ne sont pas converties. Choisis le type nécessaire d’après le sens de la colonne, et pas seulement d’après son apparence dans un aperçu.

Compter les valeurs manquantes et les valeurs répétées
orders.isna().sum()
orders.isna().any(axis=1).sum()
orders.nunique()

isna() crée un tableau booléen : True marque une cellule manquante. La somme dans chaque colonne compte ces cellules. Quantity comporte une valeur manquante et chaque autre colonne en comporte zéro. Pour compter les lignes concernées, .any(axis=1) vérifie d’abord si chaque ligne comporte une valeur manquante, puis .sum() compte ces lignes. Additionner tous les nombres obtenus par colonne pourrait compter plusieurs fois une même ligne.

nunique() compte les valeurs présentes distinctes : les commandes ont six identifiants, quatre dates, cinq produits, trois catégories, quatre quantités et cinq prix. Compare le nombre d’identifiants distincts au nombre de lignes pour vérifier leur unicité, et vérifie aussi le nombre d’identifiants manquants. orders.duplicated(subset="product") marque la deuxième ligne Notebook, d’étiquette 5, comme répétée. Un produit répété est normal ici ; un identifiant de commande répété demanderait un examen.

Lire un aperçu numérique rapide

orders.describe() indique l’effectif, la moyenne, l’écart-type, le minimum, les quartiles et le maximum des colonnes numériques. L’effectif de quantity est de cinq : sa moyenne décrit donc cinq quantités enregistrées. Vérifie les plages de valeurs plausibles et les unités en plus des types : une colonne peut être numérique tout en contenant une erreur de saisie. Lors de l’examen d’un nouveau chargement, rassemble le nombre de lignes, le nombre de colonnes, les types, les nombres de valeurs manquantes et la vérification des identifiants.

Points clés

  • Après le chargement, utilise ensemble les aperçus, les dimensions, les noms exacts des colonnes et les types de données.
  • info() affiche les nombres de valeurs non manquantes et les types ; la méthode ne renvoie pas de tableau de synthèse.
  • isna().sum() compte les cellules manquantes par colonne ; .any(axis=1).sum() compte les lignes concernées.
  • Vérifie à la fois les identifiants manquants et le nombre d’identifiants distincts.
  • Les effectifs de describe() indiquent combien de valeurs enregistrées servent au calcul d’un indicateur numérique.

2.3 Convertir les colonnes vers les types appropriés

Le type de données d’une colonne détermine les opérations qui ont un sens. Une colonne textuelle contenant "12" stocke toujours du texte ; on ne peut pas en calculer la moyenne comme pour une colonne numérique. Effectue la conversion de manière réfléchie et réaffecte le résultat au tableau.

Choisir entre conversion stricte et coercition

astype convertit un objet Series vers un type indiqué, comme int, float, str ou "Int64". La conversion échoue lorsqu’une valeur ne peut pas être représentée dans le type demandé.

raw = pd.Series(["12", "7", "n/a", "3.5"])
numeric = pd.to_numeric(raw, errors="coerce")

raw.astype(float) déclenche une ValueError à "n/a". Avec errors="coerce", les valeurs de sortie sont 12.0, 7.0, NaN et 3.5. La valeur qui n’a pas pu être convertie devient manquante au lieu d’interrompre la conversion. Compare raw.isna().sum() avec numeric.isna().sum() : le nombre de valeurs manquantes passe de zéro à une, ce qui révèle une valeur à vérifier.

La coercition est une règle de conversion, pas une preuve que toute nouvelle valeur manquante est sans conséquence. Utilise les nombres obtenus avant et après pour repérer les pertes. Stocke le résultat de la conversion dans une nouvelle variable ou colonne lorsque le texte brut aide à retrouver une valeur dont la conversion a échoué.

Conserver les entiers avec des valeurs manquantes

La colonne de quantités des commandes contient des entiers et un NaN : elle est donc de type float64. Un simple astype(int) échoue, car NaN n’a pas de représentation entière ordinaire.

orders["quantity"] = orders["quantity"].astype("Int64")

Le I majuscule compte : le type nullable Int64 conserve la valeur manquante sous la forme <NA> tout en stockant les valeurs connues comme des entiers. Ce choix convient aux effectifs comportant des valeurs manquantes. Il ne transforme pas une quantité réellement fractionnaire en un effectif entier valide.

Les séparateurs de milliers dans le texte doivent aussi être traités. pd.Series(["1,200", "950"]).str.replace(",", "").astype(int) donne 1200 et 950. Lorsque le fichier utilise cette convention, thousands="," peut la prendre en compte lors de la lecture.

Convertir des dates textuelles
orders["date"] = pd.to_datetime(orders["date"])
orders["date"].dt.day_name()

La conversion permet d’utiliser .dt.year, .dt.month, .dt.day et .dt.day_name(). Pour les six dates de commande, les noms des jours sont Monday, Monday, Tuesday, Wednesday, Wednesday et Thursday. Exécuter pd.to_datetime(orders["date"]) seul produit un objet Series converti, mais laisse la colonne d’origine sous forme de texte. C’est l’affectation qui conserve le résultat.

Stocker des catégories répétées

orders["category"].astype("category") stocke les étiquettes répétées à l’aide d’un ensemble de catégories autorisées. Sur les grands tableaux, cela économise généralement de la mémoire. Affecte le résultat pour le conserver, comme pour les autres conversions.

Le type catégoriel modifie certaines opérations. Ses catégories ne sont pas ordonnées par défaut : min() et max() déclenchent donc une TypeError. La méthode value_counts() d’une colonne catégorielle affiche aussi les catégories connues absentes d’une sélection filtrée, avec un effectif nul. Le type catégoriel est utile pour les étiquettes répétées, mais il modifie le comportement autant que le stockage.

Points clés

  • astype échoue lors des conversions invalides ; to_numeric(errors="coerce") transforme les valeurs invalides en valeurs manquantes.
  • Compare les nombres de valeurs manquantes avant et après la coercition.
  • Le type nullable Int64 stocke des entiers avec des valeurs manquantes.
  • Convertis les dates avec to_datetime et lis leurs composantes avec .dt.
  • Conserve les conversions en affectant leurs résultats.
  • Le type catégoriel non ordonné stocke efficacement les étiquettes répétées, mais modifie certains indicateurs.
3

Sélectionner des données par étiquette et par position

Une ligne peut être identifiée par son étiquette ou trouvée par sa position actuelle. Apprends à rendre ce choix explicite avec loc et iloc, à sélectionner en même temps les colonnes nécessaires et à prévoir si une sélection renvoie une valeur, un objet Series ou un DataFrame. Les bornes des tranches et les étiquettes conservées expliquent de nombreuses erreurs de décalage d’une position. Cette distinction devient particulièrement utile après le tri ou le filtrage d’un tableau.

3.1 Sélectionner des lignes et des colonnes par étiquette avec loc

Les étiquettes permettent de demander une ligne ou une colonne d’après ce qu’elle représente. Avec loc, un numéro de commande identifie une ligne même si le tableau a été trié. La sélection comporte une partie pour les lignes, suivie d’une partie pour les colonnes : df.loc[rows, columns].

Partir d’un index qui a un sens

Le fichier de commandes comporte six lignes dont les identifiants vont de 1001 à 1006. Crée orders_by_id = orders.set_index("order_id"). Ses colonnes sont, dans l’ordre, date, product, category, quantity et unit_price. Les étiquettes de lignes sont les numéros de commande, et non les positions de 0 à 5.

orders_by_id.loc[1003]
orders_by_id.loc[1004, "product"]

La première expression renvoie la commande 1003 sous forme d’objet Series : date "2026-03-03", product "Pen set", category "Stationery", quantity 2.0 et prix 4.75. L’objet Series porte le nom 1003. La seconde renvoie une cellule, "Mug".

Une étiquette absente déclenche une KeyError. orders_by_id.loc[0] échoue : avoir une première ligne à la position 0 ne crée pas d’étiquette 0.

Sélectionner des ensembles d’étiquettes
orders_by_id.loc[[1001, 1005], ["product", "unit_price"]]

Les listes sélectionnent les étiquettes dans l’ordre demandé. On obtient deux lignes et deux colonnes : Notebook à 2.5, puis Backpack à 35.0. Une liste conserve un résultat sous forme de tableau même si elle ne contient qu’une étiquette : .loc[[1003]] est un DataFrame d’une ligne.

DemandeForme
Une valeur.loc[1004, "product"]
Une ligne entière.loc[1004]
Un tableau d’une ligne.loc[[1004]]
Toutes les lignes, une colonne.loc[:, "unit_price"]

Deux-points utilisés seuls désignent toutes les étiquettes de cet axe. Omettre le sélecteur de colonnes demande aussi toutes les colonnes.

Inclure les deux bornes d’une tranche par étiquettes
orders_by_id.loc[1002:1004, "product":"quantity"]

Dans cet index ordonné, les lignes sont 1002, 1003 et 1004. La tranche de colonnes inclut product, category et quantity. L’étiquette finale des lignes et celle des colonnes sont toutes deux incluses : la forme est donc (3, 3). Appliquer ici la règle habituelle de Python, qui exclut la borne finale, ferait omettre une ligne et une colonne souhaitées.

Les étiquettes restent associées aux lignes lors du tri

Un index par défaut peut masquer la distinction entre étiquette et position. Supposons qu’un tri de scores donne les étiquettes de lignes 3, 0, 2, 1, 4. .loc[0] sélectionne toujours l’étiquette 0, désormais sur la deuxième ligne affichée. .iloc[0] sélectionne la première ligne affichée, d’étiquette 3. Le tri déplace une ligne avec son étiquette ; il ne renumérote pas l’index sans indication.

Combiner une condition et une sélection de colonnes

Le sélecteur de lignes peut être un objet Series booléen :

orders.loc[orders["unit_price"] > 5, ["product", "unit_price"]]

Cette sélection conserve Desk lamp à 18.0, Mug à 6.0 et Backpack à 35.0, et ne renvoie que les deux colonnes demandées. Le masque détermine les lignes retenues ; la liste de colonnes détermine ce qui est affiché. La même forme à deux axes permet de cibler des cellules à mettre à jour en plaçant la sélection à gauche d’une affectation.

Points clés

  • loc sélectionne les étiquettes de lignes et les noms de colonnes.
  • Les listes demandent les étiquettes dans l’ordre indiqué et conservent une dimension de type DataFrame sur cet axe.
  • Les tranches par étiquettes incluent l’étiquette finale ; deux-points sélectionnent toutes les étiquettes.
  • Les étiquettes demandées qui sont absentes déclenchent une KeyError.
  • Le tri déplace les étiquettes avec les lignes : l’étiquette 0 peut donc différer de la position 0.
  • Un masque booléen de lignes et des noms de colonnes peuvent être utilisés dans un même appel à loc.

3.2 Sélectionner par position avec iloc et choisir l’indexeur approprié

Utilise iloc lorsque la demande concerne l’emplacement d’une ligne ou d’une colonne : les trois premières lignes, la dernière colonne ou une cellule affichée à un endroit précis. Ses sélecteurs sont des positions entières, indépendantes des étiquettes d’index.

Compter à partir de zéro

orders.iloc[0] sélectionne la première ligne et orders.iloc[-1] la dernière. Une position négative compte à rebours depuis la fin. Deux positions sélectionnent une cellule : orders.iloc[2, 2] vaut "Pen set" dans le tableau de commandes d’origine, où product est à la position de colonne 2.

Le tableau indexé orders_by_id comporte les colonnes date, product, category, quantity et unit_price. Le déplacement de order_id dans l’index a modifié les positions des colonnes : product est désormais à la position 1. Le code fondé sur les positions dépend de cette structure.

S’arrêter avant la borne finale de la tranche
orders_by_id.iloc[1:3, 0:2]

Les positions de lignes sélectionnées sont 1 et 2, qui contiennent les commandes 1002 et 1003. Les positions de colonnes sont 0 et 1, soit date et product. La position de ligne 3 et la colonne 2 sont exclues, ce qui donne la forme (2, 2). Une borne initiale vide signifie le début ; une borne finale vide signifie la fin.

Les listes demandent des positions précises, y compris un mélange de positions positives et négatives. orders.iloc[[0, -1], [2, 5]] sélectionne product et unit_price pour la première et la dernière commande. Les deux sont ici Notebook à 2.5.

Prévoir la forme du résultat
SélectionRésultat
orders.iloc[0, 2]Une valeur
orders.iloc[0]Un objet Series pour une ligne
orders.iloc[:, 2]Un objet Series pour une colonne
orders.iloc[[0]]Un DataFrame d’une ligne
orders.iloc[0:1, 2:3]Un DataFrame d’une ligne et d’une colonne

Un scalaire sélectionne un élément sur un axe et supprime cette dimension. Une tranche ou une liste conserve cet axe, même si elle ne sélectionne qu’un élément. Cela compte lorsque l’opération suivante attend un tableau plutôt qu’un objet Series.

Gérer la fin d’un tableau

Le tableau de commandes de six lignes possède des positions de lignes positives ou nulles valides de 0 à 5. orders.iloc[10] déclenche une IndexError. Une tranche peut dépasser le tableau : orders.iloc[4:100] renvoie simplement les deux dernières lignes. Une position individuelle absente est une demande d’élément invalide, tandis qu’une tranche décrit un intervalle qui s’arrête aux lignes disponibles.

Choisir délibérément les étiquettes ou les positions

Pour une cellule, at utilise les étiquettes et iat utilise les positions. orders.at[2, "product"] et orders.iat[2, 2] donnent tous deux "Pen set" avant le réordonnancement des lignes.

Choisis loc lorsque tu connais un identifiant ou le sens d’une colonne. Choisis iloc lorsque l’emplacement lui-même compte. Pour combiner les premières lignes avec un nom de colonne, orders.columns.get_loc("quantity") renvoie sa position, 4, ce qui permet d’utiliser orders.iloc[0:3, 4].

Des crochets seuls peuvent changer de rôle : orders["product"] sélectionne une colonne, mais orders[2:4] extrait les lignes aux positions 2 et 3. Écrire explicitement loc et iloc rend ce choix plus lisible.

Points clés

  • iloc utilise des positions entières à partir de zéro ; les positions négatives comptent depuis la fin.
  • Les tranches par positions excluent leur borne finale et peuvent dépasser les lignes disponibles.
  • Une position individuelle hors limites déclenche une IndexError.
  • Les sélecteurs scalaires suppriment une dimension ; les listes et les tranches la conservent.
  • at sélectionne une cellule par étiquette et iat sélectionne une cellule par position.
4

Filtrer les lignes selon des conditions

Les conditions permettent de se concentrer sur les observations qui répondent à une question. Construis des masques à partir de comparaisons, combine-les et utilise des méthodes utilitaires pour les catégories, les intervalles, les valeurs manquantes et les recherches de texte. Cible ensuite une mise à jour du tableau d’origine avec une seule affectation loc. Le filtrage et la mise à jour utilisent une condition sur les lignes, mais il est essentiel de suivre quel tableau reçoit la modification avec la copie à l’écriture de pandas 3.

4.1 Filtrer avec des masques booléens

Le filtrage sélectionne les observations qui répondent à une question, par exemple les commandes de la catégorie Home dont le prix unitaire dépasse 10. Crée d’abord un masque booléen, un objet Series contenant un True ou un False par ligne. Utilise-le ensuite pour sélectionner les lignes correspondantes.

Construire et appliquer un masque
is_stationery = orders["category"] == "Stationery"
stationery = orders[is_stationery]

Le masque contient True, False, True, False, False et True. La sélection conserve les étiquettes 0, 2 et 5, correspondant aux commandes 1001, 1003 et 1006. Le filtrage conserve ces étiquettes ; il ne les renumérote pas. reset_index(drop=True) fournit des étiquettes consécutives si nécessaire.

Les opérateurs de comparaison comprennent ==, !=, <, <=, > et >=. Les comparaisons de texte sont exactes : "home" diffère de "Home", et les espaces peuvent aussi empêcher une correspondance.

Combiner les conditions ligne par ligne
is_home = orders["category"] == "Home"
is_expensive = orders["unit_price"] > 10
orders[is_home & is_expensive]

Seule Desk lamp remplit les conditions : sa catégorie est Home et son prix est de 18,0. Mug appartient à Home mais coûte 6,0. Backpack coûte 35,0 mais appartient à Bags.

Lorsque tu écris directement les comparaisons, place chacune entre parenthèses :

orders[(orders["category"] == "Home") &
       (orders["unit_price"] > 10)]

Utilise & pour « et », | pour « ou » et ~ pour « non ». Les parenthèses maintiennent chaque comparaison ensemble avant que pandas combine les masques. Sans elles, les règles de priorité de Python peuvent conduire à combiner une chaîne et un objet Series avec & et déclencher une TypeError.

Les opérateurs Python and, or et not attendent une seule valeur de vérité, et non une colonne de valeurs de vérité. Les utiliser sur des masques déclenche une ValueError indiquant que la valeur de vérité est ambiguë. Une instruction if orders["quantity"] > 1: seule pose le même problème. Utilise .any() pour savoir si au moins une ligne correspond, ou .all() pour savoir si toutes les lignes correspondent.

Compter les correspondances et calculer leur proportion

is_stationery.sum() vaut 3, car True compte pour 1 et False pour 0. is_stationery.mean() vaut 0,5, la fraction des six commandes qui correspondent. Multiplie par 100 pour l’exprimer sous la forme 50 %.

Traiter explicitement les valeurs manquantes

Avec la colonne quantity d’origine de type float64, les comparaisons avec NaN donnent False, sauf !=, qui donne True. quantity >= 1 conserve cinq lignes ; quantity < 1 n’en conserve aucune. La quantité vide n’appartient à aucune des deux sélections. Pourtant, quantity != 3 inclut cette ligne vide : « différent de » ne signifie donc pas « connu et différent ».

Après conversion en Int64 nullable, une comparaison avec <NA> produit <NA>, et le filtrage exclut ces lignes. Utilise isna() ou notna() lorsque la question porte sur les valeurs manquantes.

Pour sélectionner des colonnes en plus des lignes, utilise orders.loc[is_home, "product"]. Cette expression renvoie Desk lamp et Mug. Un masque nommé peut être réutilisé pour examiner, compter et mettre à jour le même ensemble de lignes.

Points clés

  • Une comparaison crée un résultat booléen par ligne ; le filtrage conserve les lignes True et leurs étiquettes.
  • Combine les masques avec &, | et ~, en plaçant les comparaisons entre parenthèses.
  • Utilise .any() ou .all() lorsqu’une seule valeur de vérité est nécessaire.
  • La somme d’un masque booléen compte les correspondances et sa moyenne donne leur proportion.
  • Vérifie explicitement les valeurs manquantes : le NaN des flottants et le <NA> des types nullables se comportent différemment dans les comparaisons.
  • L’égalité des textes est sensible à la casse et tient compte des espaces.

4.2 Utiliser des méthodes utilitaires et query pour les filtrages courants

Certains filtres suivent des formes courantes : appartenance à une liste, intervalle numérique, valeur manquante ou fragment de texte. Des méthodes utilitaires expriment directement ces tests et produisent des masques qui peuvent toujours être combinés à d’autres conditions.

Tester l’appartenance et les intervalles
orders[orders["category"].isin(["Home", "Bags"])]
orders[orders["unit_price"].between(4.75, 18)]

isin reconnaît toute valeur présente dans la liste. La première sélection contient les commandes 1002, 1004 et 1005. ~orders["category"].isin(["Home"]) inverse le test d’appartenance et conserve les lignes Stationery et Bags. Une expression Python avec in ne crée pas ce masque d’appartenance ligne par ligne.

between inclut les deux bornes par défaut. La deuxième sélection inclut Desk lamp à 18,0, Pen set à 4,75 et Mug à 6,0. Utilise inclusive="neither" pour exclure les deux bornes, "left" pour inclure uniquement la borne inférieure ou "right" pour inclure uniquement la borne supérieure. Choisis la règle d’inclusion des bornes selon la question posée.

Trouver les entrées manquantes et présentes

orders[orders["quantity"].isna()] conserve la commande 1006. notna() fait l’inverse et conserve les quantités enregistrées. Ne teste pas l’égalité avec np.nan : NaN est différent même de lui-même, donc quantity == np.nan ne trouve pas la ligne manquante.

Chercher à l’intérieur du texte
orders[orders["product"].str.contains("note", case=False, na=False)]

str.contains vérifie si chaque valeur textuelle contient une correspondance. Ignorer la casse permet de trouver les deux lignes Notebook. na=False considère le texte manquant comme une non-correspondance. Par défaut, la recherche traite le motif comme une expression régulière ; pour un fragment de texte littéral contenant de la ponctuation, regex=False évite d’interpréter cette ponctuation comme un motif. str.startswith et str.endswith testent le début et la fin.

Écrire un filtre sous forme de requête
orders.query("quantity >= 2 and unit_price < 5")

Cette requête conserve les commandes 1001 et 1003. Dans une chaîne query, les noms de colonnes désignent les colonnes et and, or et not sont autorisés. La chaîne est une expression de requête pandas ; sa syntaxe n’est pas celle utilisée pour combiner directement des objets Series en Python ordinaire.

Une variable Python nécessite @ :

limit = 5
orders.query("unit_price > @limit")

Le résultat contient Desk lamp, Mug et Backpack. Un nom de colonne contenant un espace doit être placé entre accents graves dans la requête, comme dans orders.query("`unit price` > 5").

La même question peut être écrite sous forme de masque, d’appel à une méthode utilitaire ou de requête. Privilégie la forme qui présente clairement la règle. Pour un intervalle, between rassemble les bornes et leur règle d’inclusion. Pour un ensemble d’étiquettes autorisées, isin évite de répéter les tests d’égalité. Si un filtre se comporte de façon inattendue, examine le masque et les valeurs exactes des colonnes avant de modifier la condition.

Points clés

  • isin teste l’appartenance et ~ inverse le masque.
  • between inclut les deux bornes, sauf si inclusive modifie cette règle.
  • isna et notna détectent les valeurs manquantes et les valeurs enregistrées.
  • str.contains recherche dans le texte ; case=False ignore la casse et na=False exclut le texte manquant.
  • Dans query, les colonnes sont nommées directement, les variables Python utilisent @ et les noms de colonnes contenant des espaces utilisent des accents graves.

4.3 Modifier correctement les valeurs des lignes sélectionnées

Une mise à jour doit cibler le tableau que tu souhaites modifier. Dans pandas 3, une sélection se comporte comme un objet distinct sous le régime de copie à l’écriture : modifier un objet sélectionné ne modifie donc pas son tableau parent.

Placer toute la cible dans une seule affectation loc
sale = orders.copy()
is_home = sale["category"] == "Home"
sale.loc[is_home, "unit_price"] *= 0.9

Le masque sélectionne deux lignes Home. Le sélecteur de colonne cible leurs prix. La multiplication par 0,9 conserve 90 % de chaque prix et réduit 18,00 à 16,20 et 6,00 à 5,40. Les autres lignes restent inchangées. La forme développée lit la même sélection à droite et affecte les valeurs multipliées à gauche.

Ici, sale est un tableau distinct utilisé pour modifier les prix, ce qui laisse orders disponible pour la comparaison. Pour mettre à jour le tableau d’origine, place orders.loc[...] lui-même à gauche de l’affectation.

Éviter l’affectation chaînée
orders[orders["category"] == "Home"]["unit_price"] = 0

Cette instruction utilise deux étapes d’indexation. La première produit un objet sélectionné ; la seconde effectue une affectation dans cet objet. Dans pandas 3, elle ne met jamais orders à jour et un avertissement ChainedAssignmentError signale le problème. Le même problème concerne orders["unit_price"][1] = 0.

Utilise orders.loc[orders["category"] == "Home", "unit_price"] = 0 lorsque tu souhaites modifier le tableau d’origine. Le tableau, les lignes correspondantes et la colonne sont tous précisés dans une seule affectation.

Comprendre les tableaux sélectionnés

Après home = orders[orders["category"] == "Home"], modifier home["unit_price"] ne change que home. Les modifications ultérieures de orders ne changent pas non plus home. Les objets peuvent partager leur stockage en interne jusqu’à ce qu’une écriture soit nécessaire, mais leurs valeurs visibles se comportent de manière indépendante.

Les anciens exemples pandas peuvent afficher SettingWithCopyWarning et utiliser .copy() après une sélection pour éviter des mises à jour incertaines. pandas 3 a supprimé cet avertissement et garantit l’indépendance des sélections de manière cohérente. Un .copy() explicite reste utile pour exprimer l’intention, mais une sélection se comporte déjà de manière indépendante lors des mises à jour.

Faire correspondre les valeurs de droite à la cible

Un scalaire remplit toutes les cellules sélectionnées. Une liste exige exactement une valeur par ligne sélectionnée et les remplit dans l’ordre de sélection. Un objet Series s’aligne par étiquette d’index :

new_prices = pd.Series([16.2, 5.4], index=[1, 3])
sale.loc[is_home, "unit_price"] = new_prices

Les lignes Home portent les étiquettes 1 et 3 : elles reçoivent donc 16,2 et 5,4. Si une étiquette sélectionnée était absente de l’objet Series, la valeur qui lui serait affectée serait NaN ; les lignes hors de la sélection resteraient inchangées. Des longueurs égales ne suffisent pas à établir la correspondance entre l’objet Series et les lignes.

Examine sale.loc[is_home, "unit_price"] après la modification et compare le résultat avec orders.loc[is_home, "unit_price"]. La méthode .sum() du masque donne 2, soit le nombre attendu de lignes ciblées par cette remise.

Points clés

  • Mets à jour le tableau voulu avec une seule affectation loc[mask, column].
  • Dans pandas 3, une affectation chaînée ne met jamais à jour le tableau d’origine.
  • Les sélections se comportent de manière indépendante sous le régime de copie à l’écriture.
  • Un scalaire remplit la sélection ; une liste suit l’ordre ; un objet Series s’aligne par étiquette.
5

Ajouter et transformer des colonnes

Les colonnes calculées expriment des relations déjà présentes dans un tableau : la quantité et le prix donnent un chiffre d’affaires, tandis qu’une condition devient une étiquette de catégorie. Utilise des calculs vectorisés et de petites transformations pour exprimer clairement ces règles. Tu choisiras aussi entre mettre en correspondance toutes les valeurs et en remplacer quelques-unes, tu conserveras les résultats par affectation et tu tiendras compte des données d’entrée manquantes et de l’alignement des étiquettes lorsque de nouvelles valeurs entrent dans un tableau.

5.1 Calculer de nouvelles colonnes à partir des colonnes existantes

Les nouvelles colonnes transforment les données enregistrées en quantités que tu peux analyser. Un calcul entre colonnes s’effectue ligne par ligne, tandis que l’index garde chaque résultat associé à son observation.

Calculer le chiffre d’affaires
orders["revenue"] = orders["quantity"] * orders["unit_price"]

Les six chiffres d’affaires sont 7,5 ; 18,0 ; 9,5 ; 24,0 ; 35,0 et NaN. Pour la première ligne, trois articles à 2,50 chacun donnent 7,50. La dernière ligne a une quantité inconnue, donc son chiffre d’affaires est également inconnu. Une affectation à un nouveau nom ajoute une colonne à droite ; une affectation à un nom existant remplace cette colonne.

Les calculs sur les colonnes sont vectorisés. Ils expriment une règle pour toute la colonne et évitent une boucle Python sur les lignes. Sur les grands tableaux, cette forme est beaucoup plus rapide que for ou iterrows, et l’expression rend claire la relation entre les données d’entrée.

Utiliser les valeurs enregistrées dans un total

orders["revenue"].sum() ignore NaN et donne 94,0, le total des cinq chiffres d’affaires connus. .mean() donne 18,8, car le dénominateur est le nombre de chiffres d’affaires enregistrés, soit cinq. Diviser 94,0 par les six lignes reviendrait à traiter implicitement le chiffre d’affaires manquant comme s’il contribuait au total par un zéro connu.

Pour calculer les parts en pourcentage :

orders["share_pct"] = (
    orders["revenue"] / orders["revenue"].sum() * 100
).round(1)

Les parts sont 8,0 ; 19,1 ; 10,1 ; 25,5 ; 37,2 et NaN. Ce sont des parts du total connu. L’entrée manquante reste manquante dans les calculs.

Renvoyer un tableau avec assign

assign renvoie un nouveau DataFrame avec des colonnes ajoutées ou remplacées, sans modifier le tableau d’entrée. Cette méthode s’intègre naturellement dans un enchaînement :

with_tax = orders.assign(
    tax=lambda d: (d["revenue"] * 0.2).round(2)
)

L’expression lambda lit le tableau tel qu’il est à ce stade de l’enchaînement. Elle donne les valeurs de taxe 1,5 ; 3,6 ; 1,9 ; 4,8 ; 7,0 et NaN. Dans pandas 3, pd.col("revenue") * 0.2 est une autre façon de désigner une colonne dans assign.

Les calculs décimaux peuvent révéler de minuscules erreurs de représentation binaire en virgule flottante : 9,5 multiplié par 0,2 peut être stocké sous la forme 1.9000000000000001. .round(2) donne une valeur utile pour la présentation. Évite les tests d’égalité exacte sur les décimaux calculés lorsque de petites erreurs de représentation sont possibles.

Comprendre comment l’affectation associe les lignes
orders["home_price"] = orders.loc[
    orders["category"] == "Home", "unit_price"
]

L’objet Series affecté porte les étiquettes 1 et 3. Ces lignes reçoivent 18,0 et 6,0 ; toutes les autres reçoivent NaN. L’affectation d’un objet Series associe les étiquettes, même lorsque sa longueur diffère de celle du tableau. Une liste ordinaire n’a pas d’étiquettes et doit contenir exactement une valeur par ligne. Un scalaire, comme dans orders["currency"] = "EUR", remplit toutes les lignes.

Calculer des valeurs à partir de texte ou de dates

Les accesseurs .str et .dt fournissent aussi des opérations vectorisées sur les colonnes. orders["product"].str.upper() donne les noms en majuscules, et .str.len() donne les longueurs 8, 9, 7, 3, 8 et 8. Affecte ces résultats à une nouvelle colonne lorsque les valeurs d’origine et les valeurs calculées sont toutes deux utiles.

Points clés

  • Affecter une expression portant sur des colonnes stocke un résultat par ligne.
  • Des données d’entrée inconnues produisent généralement des résultats de calcul inconnus ; les indicateurs ignorent les valeurs manquantes par défaut.
  • Les opérations vectorisées sur les colonnes évitent les boucles sur les lignes.
  • assign renvoie un nouveau DataFrame et peut désigner des colonnes au moyen d’une expression lambda.
  • L’affectation d’un objet Series associe les étiquettes ; celle d’une liste suit l’ordre et la longueur des lignes.
  • Utilise .str et .dt pour les colonnes calculées à partir de texte et de dates.

5.2 Recoder et transformer des valeurs avec np.where, map et apply

Transformer une colonne peut consister à appliquer une règle numérique, à attribuer une étiquette ou à mettre des étiquettes existantes en correspondance. Choisis une méthode dont le comportement correspond à la règle, en particulier pour les valeurs que celle-ci ne mentionne pas.

Transformer une condition en étiquettes
orders["price_band"] = np.where(
    orders["unit_price"] >= 5, "high", "low"
)

np.where choisit son deuxième argument lorsque la condition vaut True et son troisième lorsqu’elle vaut False. Pour les prix 2,50 ; 18,00 ; 4,75 ; 6,00 ; 35,00 et 2,50, les étiquettes sont low, high, low, high, high et low. L’opérateur >= inclut un prix exactement égal à 5.

Mettre toutes les valeurs en correspondance ou en modifier quelques-unes
codes = {"Stationery": "ST", "Home": "HM", "Bags": "BG"}
orders["category_code"] = orders["category"].map(codes)

map avec le dictionnaire donne ST, HM, ST, HM, BG et ST. Une valeur absente du dictionnaire devient NaN. Avec seulement {"Stationery": "ST"}, Home et Bags deviennent tous deux des valeurs manquantes. Utilise une correspondance complète lorsque chaque catégorie doit recevoir un code.

replace modifie les valeurs indiquées et laisse les autres inchangées. orders["category"].replace({"Bags": "Luggage"}) conserve Stationery et Home tout en renommant Bags.

Modification souhaitéeMéthode adaptée
Donner un code à chaque catégorie connuemap avec un dictionnaire
Renommer quelques étiquettes existantesreplace
Choisir entre deux résultats selon une conditionnp.where
Appliquer une fonction personnalisée

Un objet Series peut transmettre chaque valeur à une fonction par map ou apply. orders["product"].apply(len) renvoie la longueur de chaque nom de produit. Passe len lui-même ; len() l’appellerait immédiatement sans valeur.

Une expression lambda peut exprimer une petite règle appliquée aux valeurs : orders["unit_price"].apply(lambda p: "budget" if p < 5 else "standard"). Elle renvoie budget, standard, budget, standard, standard et budget.

Pour une logique utilisant plusieurs cellules d’une même ligne, apply sur un DataFrame accepte axis=1 :

orders.apply(
    lambda r: r["quantity"] * r["unit_price"], axis=1
)

La fonction lit la quantité et le prix de chaque ligne. Pour ce calcul, la multiplication directe des colonnes est plus claire et beaucoup plus rapide sur un grand tableau. Utilise des expressions vectorisées ou np.where lorsqu’elles permettent d’exprimer le calcul ; réserve les fonctions appliquées ligne par ligne aux logiques qui en ont besoin.

Utiliser les transformations numériques intégrées

round(n) arrondit à n décimales, abs() donne les valeurs absolues et clip(lower=..., upper=...) écrête les valeurs aux bornes indiquées. orders["unit_price"].clip(upper=20) transforme 35,0 en 20,0 et laisse les cinq autres prix inchangés. La méthode ne supprime pas la ligne correspondant au prix élevé.

Ces transformations renvoient de nouvelles valeurs. Affecte-les à une nouvelle colonne pour conserver les données d’entrée et les vérifier, ou remplace la colonne d’origine si c’est le résultat voulu. Examine quelques lignes transformées ou exécute value_counts() pour vérifier que les nouvelles étiquettes et leurs effectifs correspondent à la règle.

Points clés

  • np.where sélectionne un résultat pour le cas vrai ou le cas faux de chaque valeur de la condition.
  • map avec un dictionnaire transforme les valeurs non répertoriées en valeurs manquantes ; replace les conserve.
  • Passe la fonction elle-même à apply ; utilise axis=1 pour une fonction appliquée aux lignes d’un DataFrame.
  • Privilégie les opérations vectorisées lorsqu’elles permettent d’exprimer la règle.
  • clip écrête les valeurs, tandis que round et abs les transforment sans sélectionner de lignes.
6

Trier les données, attribuer des rangs et calculer des indicateurs

Un tableau ordonné et une synthèse statistique concise répondent à des questions différentes sur les mêmes observations. Trie les enregistrements, attribue des rangs avec une règle choisie pour les ex æquo et sélectionne des effectifs ou des indicateurs de tendance centrale ou de dispersion adaptés aux données. Examine ensuite les proportions des catégories et les liaisons entre variables numériques. Les valeurs manquantes, le sens du classement, les dénominateurs d’échantillon et les limites de la corrélation influencent tous l’interprétation d’un résultat.

6.1 Trier les lignes selon les valeurs ou l’index

Le tri modifie l’ordre d’apparition des observations. Il maintient ensemble les valeurs de chaque ligne et déplace son étiquette avec elle. Détermine ce qui est prioritaire et comment ordonner les valeurs ex æquo avant de sélectionner les plus grandes ou les plus petites.

Trier selon une colonne
scores = pd.DataFrame({
    "name": ["Ana", "Ben", "Chen", "Dara", "Eli"],
    "points": [88, 92, 88, 75, 92]
})
ordered = scores.sort_values("points")

La plus petite valeur vient en premier par défaut. Le score de Dara, 75, vient en premier, suivi des deux scores de 88 puis des deux scores de 92. Les étiquettes de lignes se déplacent avec les enregistrements. Pour les ex æquo, l’algorithme de tri par défaut ne garantit pas l’ordre initial ; les étiquettes affichées peuvent être 3, 0, 2, 1, 4, mais il ne faut pas supposer que les lignes ex æquo conservent cet ordre.

Utilise ascending=False pour placer les plus grandes valeurs en premier. sort_values renvoie un tableau et laisse scores inchangé, sauf si le résultat est affecté à cette variable.

Choisir comment départager les ex æquo
scores.sort_values(
    ["points", "name"], ascending=[False, True]
)

La première clé est prioritaire. Les scores décroissent ; les noms sont triés par ordre croissant pour les scores égaux. L’ordre est Ben, Eli, Ana, Chen et Dara. Trier d’abord les noms répondrait à une autre question, car les noms deviendraient la clé principale.

Lorsque les ex æquo d’un tri sur une colonne doivent conserver l’ordre d’entrée, utilise scores.sort_values("points", kind="stable"). La stabilité conserve les lignes ex æquo dans leur ordre existant. Une clé secondaire donne quant à elle une règle explicite pour ordonner les ex æquo.

Placer les valeurs manquantes et le texte

Les valeurs manquantes sont placées en dernier par défaut, tant dans un tri croissant que décroissant. pd.Series([3.0, np.nan, 1.0]).sort_values() donne 1,0 ; 3,0, puis NaN. na_position="first" place l’entrée manquante au début ; inverser uniquement le sens du tri ne le fait pas.

Le tri du texte suit les codes des caractères. "Zebra" est placé avant "apple", car les majuscules et les minuscules occupent des plages différentes. Des noms écrits de manière cohérente, comme Bags, Home et Stationery, sont triés dans l’ordre alphabétique attendu.

Trier les étiquettes ou les renuméroter

sort_index() ordonne les étiquettes de lignes, et non les valeurs des données. Après un tri par scores, la méthode peut rétablir l’ordre des étiquettes par défaut d’origine. sort_index(ascending=False) inverse l’ordre des étiquettes. En revanche, reset_index(drop=True) conserve l’ordre actuel des lignes et remplace leurs étiquettes par 0, 1, 2 et ainsi de suite.

Sélectionner les lignes aux plus grandes ou aux plus petites valeurs

scores.nlargest(2, "points") renvoie Ben et Eli, qui ont tous deux 92. nsmallest prend les valeurs les plus faibles. Si le seuil tombe au milieu d’un groupe d’ex æquo, décide si toutes les lignes ex æquo doivent être conservées. scores.nlargest(1, "points", keep="all") renvoie les deux scores de 92, même si n vaut 1. Le nombre demandé est alors un seuil et non une garantie sur le nombre final de lignes.

Points clés

  • sort_values ordonne les lignes selon les valeurs des données ; sort_index ordonne les étiquettes de lignes.
  • ascending=False place les grandes valeurs en premier, tandis que les valeurs manquantes restent en dernier par défaut.
  • Plusieurs clés de tri s’appliquent par ordre de priorité et peuvent utiliser des sens différents.
  • Utilise une clé secondaire ou un tri stable sur une colonne lorsque l’ordre des ex æquo compte.
  • reset_index(drop=True) renumérote les lignes dans leur ordre actuel sans les trier à nouveau.
  • keep="all" dans une sélection des plus grandes valeurs peut renvoyer plus de n lignes.

6.2 Attribuer des rangs aux valeurs et traiter les ex æquo

Un rang indique où se situe une valeur dans l’ordre trié sans déplacer sa ligne. Il est utile lorsque chaque observation doit recevoir un numéro de place à côté de ses données d’origine. Les ex æquo nécessitent une règle, car plusieurs valeurs peuvent occuper une même partie de cet ordre.

Choisir le sens

scores["points"].rank() attribue les rangs de la plus petite valeur à la plus grande. Utilise ascending=False pour un tableau de résultats où les scores élevés doivent obtenir les meilleurs rangs. La méthode de traitement des ex æquo détermine alors le numéro de place attribué à chaque groupe ex æquo.

Les scores de l’exemple, dans l’ordre des lignes, sont Ana 88, Ben 92, Chen 88, Dara 75 et Eli 92. Dans l’ordre décroissant, les scores de 92 occupent les places 1 et 2, ceux de 88 les places 3 et 4, et 75 la place 5. La méthode par défaut method="average" attribue à chaque valeur ex æquo la moyenne des places occupées. Les valeurs renvoyées, dans l’ordre initial des lignes, sont 3,5 ; 1,5 ; 3,5 ; 5,0 et 1,5.

Choisir une méthode pour les ex æquo
MéthodeRangs décroissants dans l’ordre initial des lignesRègle pour les ex æquo
average3,5 ; 1,5 ; 3,5 ; 5,0 ; 1,5Moyenne des rangs occupés
min3, 1, 3, 5, 1Plus petit rang occupé
max4, 2, 4, 5, 2Plus grand rang occupé
dense2, 1, 2, 3, 1Un rang par valeur distincte, sans saut
first3, 1, 4, 5, 2Rangs distincts selon l’ordre d’apparition

Avec min, deux gagnants au rang 1 signifient que le score suivant commence au rang 3. Avec dense, le score distinct suivant commence au rang 2. first départage les ex æquo même lorsque les scores eux-mêmes ne permettent pas de privilégier une personne ; la méthode suit l’ordre d’entrée.

Les rangs renvoyés sont des flottants, ce qui permet d’obtenir des valeurs comme 1,5. Lorsque la méthode choisie donne des rangs entiers et qu’aucun ne manque, .astype(int) les convertit pour l’affichage. Un type entier ordinaire ne peut pas contenir un rang manquant.

Exprimer les rangs sous forme de fractions

Avec la méthode de la moyenne par défaut et des valeurs non manquantes, rank(pct=True) divise chaque rang par le nombre de valeurs classées. Classer les cinq scores de l’exemple par ordre croissant donne 2,5 ; 4,5 ; 2,5 ; 1,0 et 4,5. La division par cinq donne 0,5 ; 0,9 ; 0,5 ; 0,2 et 0,9.

Les valeurs les plus élevées ex æquo reçoivent 0,9 et non 1, car leur rang moyen est de 4,5. Un rang centile décrit le rang par rapport aux valeurs classées ; ce n’est pas un pourcentage du score lui-même.

Traiter les rangs manquants et stocker les résultats

Les valeurs manquantes conservent des rangs NaN par défaut. Avec les chiffres d’affaires 7,5 ; 18,0 ; 9,5 ; 24,0 ; 35,0 et NaN, les rangs décroissants sont 5, 3, 4, 2, 1 et NaN. na_option="bottom" place l’entrée manquante après les valeurs enregistrées et lui donne le rang 6.

scores["place"] = scores["points"].rank(
    method="min", ascending=False
)

Les lignes restent dans l’ordre Ana, Ben, Chen, Dara et Eli. La nouvelle colonne de places contient 3, 1, 3, 5 et 1. Effectue un tri séparé si l’affichage doit présenter les gagnants en premier.

Points clés

  • L’attribution de rangs indique les places sans déplacer les lignes ; le classement décroissant donne de petits numéros de rang aux grandes valeurs.
  • Les méthodes de traitement des ex æquo déterminent si les rangs partagés laissent des sauts ou suivent l’ordre d’entrée.
  • La méthode de la moyenne par défaut peut renvoyer des rangs fractionnaires.
  • Avec la méthode de la moyenne par défaut, pct=True divise par le nombre de valeurs classées.
  • Les valeurs manquantes gardent des rangs manquants par défaut ; na_option="bottom" les classe en dernier.

6.3 Décrire les colonnes à l’aide de statistiques descriptives

Une statistique descriptive condense de nombreuses observations en une quantité utile. Choisis une statistique adaptée à la question et lis son nombre de valeurs non manquantes afin de savoir sur combien de données elle repose.

Calculer la tendance centrale et la dispersion
weather = pd.DataFrame({
    "temp_c": [14.0, 17.5, 16.0, 21.0, 19.5, 12.5, 15.0],
    "rain_mm": [0.0, 2.4, 0.0, 0.0, 5.1, 12.3, 0.8]
}, index=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"])

Pour weather["temp_c"], sum() vaut 115,5, mean() vaut 16,5 et median() vaut 16,0. Le minimum est de 12,5 et le maximum de 21,0, ce qui donne une étendue de 8,5 °C. idxmax() renvoie l’étiquette "Thu", tandis que idxmin() renvoie "Sat" : ces méthodes identifient les observations au lieu de renvoyer les valeurs extrêmes elles-mêmes.

std() et var() mesurent la dispersion. pandas utilise par défaut le dénominateur d’échantillon, ddof=1, en divisant les écarts au carré par le nombre d’observations moins un. Ici, l’écart-type est d’environ 3,028 °C et la variance d’environ 9,167 degrés Celsius au carré. std(ddof=0) utilise le nombre d’observations lui-même et donne environ 2,803 °C. La fonction np.std de NumPy utilise ddof=0 par défaut : harmonise donc ce paramètre avant de comparer les résultats.

Lire les quartiles et describe

quantile(0.25) donne le premier quartile, 14,5 ; quantile(0.5) donne la médiane, 16,0 ; quantile(0.75) donne le troisième quartile, 18,5. L’interpolation par défaut peut renvoyer une valeur située entre des relevés enregistrés.

weather.describe() rassemble l’effectif, la moyenne, l’écart-type, le minimum, les trois quartiles et le maximum des colonnes numériques. Pour la pluie, la moyenne est d’environ 2,94 mm et la médiane de 0,8 mm. Le relevé de 12,3 mm tire la moyenne vers le haut ; la médiane décrit mieux une journée typique de cette semaine dont la distribution des précipitations est asymétrique à droite.

Tenir compte des valeurs manquantes et des types

Pour pd.Series([1, np.nan, 3]), .mean() vaut 2,0, car les valeurs manquantes sont ignorées par défaut. .count() vaut 2, tandis que .size vaut 3. Avec skipna=False, la moyenne vaut NaN. N’utilise pas le nombre total de lignes comme dénominateur pour la moyenne par défaut lorsque certaines entrées sont manquantes.

Les synthèses textuelles sont différentes. orders["category"].describe() donne count 6, unique 3, top Stationery et freq 3. Calculer la moyenne du tableau de commandes contenant du texte déclenche une TypeError ; utilise orders.mean(numeric_only=True) ou sélectionne les colonnes numériques avec select_dtypes("number").

Calculer des indicateurs selon un axe

Par défaut, les statistiques d’un DataFrame effectuent une réduction en parcourant les lignes pour donner un résultat par colonne. axis=1 donne au contraire un résultat par ligne ; sélectionne des quantités dont les unités peuvent être combinées de façon cohérente.

orders[["quantity", "unit_price"]].agg(["mean", "max"])

agg calcule ensemble plusieurs statistiques nommées. Quantity a une moyenne de 2,2 et un maximum de 4,0 ; unit_price a une moyenne d’environ 11,46 et un maximum de 35,0. weather["rain_mm"].cumsum() donne les totaux cumulés 0,0 ; 2,4 ; 2,4 ; 2,4 ; 7,5 ; 19,8 et 20,6 mm, en conservant un résultat par jour.

Points clés

  • Choisis des totaux ou des indicateurs de tendance centrale ou de dispersion adaptés à la question.
  • describe rassemble les statistiques numériques courantes ; les colonnes textuelles ont des synthèses fondées sur les fréquences.
  • count exclut les valeurs manquantes, tandis que size les inclut.
  • L’écart-type de pandas utilise ddof=1 ; NumPy utilise ddof=0 par défaut.
  • Les quantiles peuvent interpoler entre des relevés.
  • idxmax et idxmin renvoient des étiquettes ; cumsum renvoie des totaux cumulés.
  • agg demande plusieurs statistiques et axis contrôle le sens de la réduction.

6.4 Compter les valeurs et mesurer les liaisons

Les effectifs décrivent le nombre d’occurrences des valeurs ; les corrélations décrivent comment deux variables numériques évoluent ensemble. Ces deux types d’indicateurs demandent une interprétation : que compte-t-on, que manque-t-il et quelle liaison la statistique mesure-t-elle ?

Compter les catégories ou lister les valeurs distinctes

orders["category"].value_counts() donne Stationery 3, Home 2 et Bags 1, par ordre de fréquence. L’objet Series renvoyé est nommé count. Les entrées manquantes sont exclues par défaut ; dropna=False les inclut dans un effectif distinct.

orders["category"].value_counts(normalize=True)

L’objet Series normalisé est nommé proportion : Stationery vaut 0,5, Home environ 0,333 et Bags environ 0,167. Une multiplication par 100 permet de les exprimer en pourcentages. Avec la règle par défaut pour les valeurs manquantes, ces proportions décrivent les valeurs présentes.

QuestionMéthode
Combien de fois chaque valeur apparaît-elle ?value_counts()
Quelles valeurs distinctes apparaissent ?unique()
Combien de valeurs présentes distinctes apparaissent ?nunique()
Quelle valeur ou quelles valeurs apparaissent le plus souvent ?mode()

unique() conserve l’ordre de première apparition : Stationery, Home, Bags. mode() renvoie un objet Series, car plusieurs valeurs peuvent être ex æquo pour la fréquence la plus élevée. La méthode ne demande pas de choisir arbitrairement une seule valeur gagnante.

On peut compter directement les cas qui remplissent une condition. (weather["rain_mm"] > 0).sum() compte quatre jours de pluie. Sa méthode .mean() vaut environ 0,571 : il a donc plu pendant environ 57 % des sept jours.

Mesurer une liaison linéaire

weather["temp_c"].corr(weather["rain_mm"]) donne une corrélation de Pearson d’environ −0,397. Son signe négatif indique que les jours les plus chauds tendaient à être moins pluvieux dans ces observations. Sa valeur décrit à quel point les données suivent une droite, sur une échelle allant de −1 à 1 en passant par 0.

Une valeur de 1 signifie une liaison linéaire croissante parfaite ; −1 signifie une liaison linéaire décroissante parfaite. Une valeur proche de zéro indique une faible liaison linéaire. Une liaison courbe peut néanmoins être forte même lorsque la corrélation de Pearson est proche de zéro. La corrélation décrit aussi une liaison : elle ne prouve pas que modifier une variable provoque une modification de l’autre.

Lire une matrice de corrélation

weather.corr() donne toutes les paires de colonnes numériques ensemble. La matrice est symétrique : la corrélation de la température avec la pluie est la même que celle de la pluie avec la température. Une colonne numérique dont les valeurs ne sont pas toutes égales a une corrélation de 1 avec elle-même ; une colonne constante n’a pas de corrélation définie et donne NaN à la place.

Pour les liaisons toujours croissantes ou toujours décroissantes sans suivre une droite, method="spearman" calcule la corrélation à partir des rangs. La méthode modifie le type de relation décrit : indique-la donc lorsque tu présentes un résultat.

Le calcul météorologique n’utilise que sept relevés. Il décrit cette petite semaine observée ; des affirmations solides sur une tendance climatique plus large exigent davantage de données. Un compte rendu utile indique les variables, le signe et la valeur du coefficient, la méthode et le nombre d’observations.

Points clés

  • value_counts indique les effectifs par valeur ; la normalisation indique les proportions des valeurs comptées.
  • unique, nunique et mode répondent à des questions différentes sur les valeurs distinctes et fréquentes.
  • La somme d’une condition compte les correspondances et sa moyenne donne une proportion.
  • La corrélation de Pearson mesure la liaison linéaire de −1 à 1.
  • Une matrice de corrélation est symétrique ; les colonnes constantes donnent des corrélations non définies.
  • La corrélation de Spearman utilise les rangs, et une corrélation seule n’établit aucune cause.

Débuter avec pandas : exemples

6 Leçons Interactives

1

Construire un tableau dont les étiquettes ont un sens

12 étapes
Créer des données étiquetées, prévoir l’alignement et choisir un index pour des recherches fiables.
  1. 1
    IntroductionGarder les valeurs associées à leur sens

    Une liste fournit des valeurs dans un ordre. pandas ajoute des étiquettes pour que tu puisses identifier ce que décrit chaque valeur, même après le déplacement des lignes. Commence par une variable étiquetée, puis combine plusieurs variables dans un tableau.

    La question essentielle est de savoir si une opération suit l’identité d’une ligne ou sa position actuelle. Cette distinction explique à la fois les calculs sur les objets Series et le choix d’un index utile pour un tableau.

  2. 2
    ExempleConstruire un objet Series étiqueté pour la pluie

    Crée trois relevés de pluie en millimètres :

    rain = pd.Series([4.5, 3.0, 6.2],
        index=["Mon", "Tue", "Wed"], name="rain_mm")
    

    Les valeurs et les étiquettes sont associées dans l’ordre. rain["Tue"] donne 3.0, tandis que rain.iloc[0] donne 4.5. La première demande désigne un jour ; la seconde désigne une position. .dtype vaut float64 et .size vaut 3.

  3. 3
    ExplicationAppliquer une règle à chaque valeur

    Un objet Series permet des opérations vectorisées : rain * 2 double chaque relevé et conserve les étiquettes des jours. rain > 4 produit True, False et True, là encore avec les étiquettes des jours.

    Utilise les attributs tels que .index, .name et .dtype sans parenthèses. Lorsque tu as besoin des valeurs sous forme de tableau NumPy, appelle .to_numpy() ; .values peut renvoyer un tableau pandas pour certains types de données.

  4. 4
    ExempleAdditionner par étiquette et non par ligne affichée

    Supposons que a contienne x 1, y 2 et z 3, tandis que b contient y 10, z 20 et w 30. Dans a + b, y est associé à y, ce qui donne 12.0, et z est associé à z, ce qui donne 23.0.

    Les étiquettes x et w n’ont pas de correspondance : leurs résultats sont donc NaN. a.add(b, fill_value=0) donne à la place x 1.0 et w 30.0. Une même position de ligne n’associe pas des entrées portant des étiquettes différentes.

  5. 5
    DéfiPrévoir une somme avec alignement

    Un objet Series porte les étiquettes a et b avec les valeurs 4 et 7. Un autre porte les étiquettes b et c avec les valeurs 3 et 9. Quels sont les résultats non manquants de l’addition ordinaire ?

    ---reveal---

    Seule l’étiquette b est présente dans les deux entrées. Sa somme est 7 plus 3, soit 10.0. Les étiquettes a et c ont des résultats manquants. Additionner les premières valeurs entre elles associerait à tort a à b.

  6. 6
    ExemplePlacer plusieurs variables dans des colonnes

    Crée un petit tableau de commandes :

    df = pd.DataFrame({"product": ["Notebook", "Mug"],
        "quantity": [3, 4], "unit_price": [2.5, 6.0]})
    

    Chaque liste fournit une colonne et doit contenir une valeur par ligne. Les colonnes partagent les étiquettes d’index 0 et 1, mais conservent leurs propres types de données. .shape vaut (2, 3), tandis que .size vaut 6, car il compte toutes les cellules.

  7. 7
    Point cléConserver la forme nécessaire à l’étape suivante

    df["quantity"] renvoie un objet Series. df[["quantity"]] renvoie un DataFrame à une colonne, car la liste intérieure demande un ensemble de colonnes.

    Il s’agit d’une différence de structure, même si les valeurs visibles correspondent. Les crochets évitent aussi les collisions de noms : une colonne nommée size nécessite df["size"], car df.size désigne le nombre de cellules du DataFrame.

  8. 8
    DéfiChoisir le sens d’un total

    Pour les colonnes a [1, 2] et b [3, 4], que renvoie une somme par ligne et quel axe permet de la demander ?

    ---reveal---

    Utilise df.sum(axis=1). La première ligne donne 1 plus 3, soit 4 ; la seconde donne 2 plus 4, soit 6. L’axe par défaut parcourt les lignes et donnerait à la place les totaux de colonnes a 3 et b 7.

  9. 9
    ExempleUtiliser l’identifiant de commande comme index

    Pour un tableau possédant une colonne order_id, enregistre by_id = orders.set_index("order_id"). Les numéros de commande quittent les colonnes ordinaires pour devenir l’index de lignes.

    Une recherche comme by_id.loc[1004] désigne désormais une commande au lieu de son emplacement actuel. Vérifie by_id.index.is_unique avant de compter sur chaque numéro pour identifier exactement une ligne ; pandas autorise les étiquettes en double.

  10. 10
    ConseilEnregistrer une modification d’étiquettes

    rename, drop, set_index et reset_index renvoient de nouveaux tableaux. Conserve le résultat par affectation, par exemple orders = orders.rename(columns={"unit_price": "price"}).

    Une affectation oubliée laisse l’ancien tableau en place. Un ancien nom de colonne mal orthographié dans rename est ignoré par défaut : examine donc .columns lorsque le nouveau nom attendu est absent.

  11. 11
    DéfiRétablir les identifiants sans les perdre

    Un tableau utilise les identifiants de commande comme index. Tu as besoin d’un index de lignes par défaut tout en conservant les identifiants comme données. Quelle opération dois-tu enregistrer ?

    ---reveal---

    Enregistre df = df.reset_index(). Cette opération conserve l’ancien index dans une colonne et fournit les étiquettes 0, 1, 2 et ainsi de suite. Utiliser drop=True supprimerait ces identifiants. L’ordre des lignes reste le même.

  12. 12
    RécapitulatifPrévoir l’identité, le type et la forme

    Avant de lire un résultat, vérifie trois points : quelles étiquettes identifient ses valeurs, quel type de données les stocke et combien d’axes la sélection conserve.

    Les calculs sur les objets Series suivent les étiquettes. Un DataFrame organise les variables dans des colonnes dotées de types. Les modifications d’index permettent à un identifiant qui a un sens de servir aux recherches ultérieures, à condition d’enregistrer le tableau renvoyé et que ses étiquettes identifient les lignes de manière unique.

2

Charger un fichier CSV et vérifier son sens

13 étapes
Lire un fichier, retrouver l’origine des problèmes de structure et conserver des types numériques et de dates utiles.

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

  1. 1
    IntroductionFaire du chargement une étape vérifiable
  2. 2
    ExplicationLire des enregistrements dans un tableau
  3. 3
    ExempleAdapter les séparateurs de champs et les séparateurs décimaux
  4. 4
    ConseilPréserver les codes lors de la lecture
  5. 5
    DéfiConserver le premier enregistrement
  6. 6
    ExempleVérifier la structure visible
  7. 7
    ExplicationCompter les valeurs présentes et manquantes
  8. 8
    DéfiVérifier un identifiant et une mesure
  9. 9
    ExempleConvertir du texte numérique et retrouver une erreur
  10. 10
    Point cléConserver des effectifs entiers malgré les valeurs manquantes
  11. 11
    ExempleRendre possibles les opérations sur les dates
  12. 12
    DéfiCorriger une importation numérique
  13. 13
    RécapitulatifRelier la structure, les types et les effectifs
3

Choisir des lignes par identité ou par emplacement

10 étapes
Comparer loc et iloc, prévoir les bornes des tranches et conserver la forme de résultat nécessaire.

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

  1. 1
    IntroductionDéterminer si l’identité ou l’emplacement compte
  2. 2
    ExempleLire une commande connue
  3. 3
    ExempleLire une tranche par étiquettes à bornes incluses
  4. 4
    DéfiConserver un tableau d’une ligne
  5. 5
    ExempleLire une tranche par positions
  6. 6
    ConseilLire depuis la fin et au-delà de la fin
  7. 7
    DéfiPrévoir une ligne ou une valeur
  8. 8
    LienUtiliser une forme courte pour une cellule
  9. 9
    DéfiSuivre une ligne lors d’un tri
  10. 10
    RécapitulatifPréciser le sélecteur et la forme
4

Filtrer les enregistrements et mettre à jour le bon tableau

13 étapes
Construire une condition, combiner des tests et effectuer une modification ciblée sous le régime de copie à l’écriture.

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

  1. 1
    IntroductionTransformer une question sur les données en test sur les lignes
  2. 2
    ExempleConstruire un masque booléen
  3. 3
    ExplicationExiger les deux conditions
  4. 4
    ConseilUtiliser une seule valeur de vérité lorsque c’est nécessaire
  5. 5
    DéfiCompter les résultats d’une condition combinée
  6. 6
    ExempleExprimer directement un intervalle
  7. 7
    Point cléTrouver les valeurs manquantes avec un test adapté
  8. 8
    DéfiExprimer un filtre avec query
  9. 9
    ExempleAppliquer une remise aux seuls prix Home
  10. 10
    ExplicationComprendre pourquoi une chaîne ne modifie pas le tableau parent
  11. 11
    ConseilAssocier les valeurs de mise à jour par étiquette
  12. 12
    DéfiCombiner filtrage et mise à jour
  13. 13
    RécapitulatifRendre explicites les conditions et les cibles
5

Transformer les colonnes existantes en nouvelles données utiles

12 étapes
Calculer le chiffre d’affaires, conserver les valeurs manquantes et choisir des méthodes de mise en correspondance et de transformation adaptées.

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

  1. 1
    IntroductionExprimer une règle une fois pour chaque colonne
  2. 2
    ExempleCalculer un chiffre d’affaires par commande
  3. 3
    Point cléLire le dénominateur d’une moyenne
  4. 4
    ExempleAjouter une colonne dans un enchaînement
  5. 5
    DéfiPlacer les valeurs d’un objet Series fourni
  6. 6
    ExempleChoisir des étiquettes à partir d’un seuil
  7. 7
    ExplicationDéterminer le traitement des valeurs non répertoriées
  8. 8
    DéfiChoisir une méthode de recodage partiel
  9. 9
    ConseilPasser des fonctions sans les appeler
  10. 10
    ExempleÉcrêter les valeurs sans supprimer d’enregistrements
  11. 11
    DéfiSuivre une colonne calculée et recodée
  12. 12
    RécapitulatifVérifier la règle et les entrées sans correspondance
6

Ordonner les données et interpréter leurs indicateurs

18 étapes
Suivre les règles de tri et d’attribution des rangs, puis calculer et interpréter des indicateurs numériques et catégoriels.

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

  1. 1
    IntroductionChoisir la vue qui répond à la question
  2. 2
    ExempleTrier d’abord selon les scores, puis selon les noms
  3. 3
    ConseilConserver tous les ex æquo au seuil
  4. 4
    DéfiDistinguer l’ordre des étiquettes de celui des valeurs
  5. 5
    ExempleCalculer la moyenne des places occupées par les ex æquo
  6. 6
    ExplicationChoisir entre des sauts et des groupes consécutifs
  7. 7
    DéfiLire un rang centile
  8. 8
    ExempleConstruire une synthèse météorologique
  9. 9
    ExplicationHarmoniser le dénominateur de dispersion
  10. 10
    ExempleLire les quartiles et une moyenne influencée par l’asymétrie
  11. 11
    DéfiVérifier une moyenne avec son effectif
  12. 12
    ExempleCompter les catégories et calculer leurs proportions
  13. 13
    Point cléDistinguer trois questions sur les valeurs
  14. 14
    DéfiExprimer les résultats d’une condition sous forme de fraction
  15. 15
    ExplicationDécrire précisément une liaison statistique
  16. 16
    DéfiLire une matrice après vérification des données
  17. 17
    DéfiChoisir et présenter un indicateur
  18. 18
    RécapitulatifGarder visible la règle de chaque indicateur

Débuter avec pandas : QCM

50 Questions Pratiques en 5 séries

Série 1 : Lire et utiliser un tableau pandas10 Questions Pratiques

Question 1 sur 10

s = pd.Series([8, 13, 5], index=[2, 0, 1]). Que renvoie s[0] ?
  1. 8
  2. 13
  3. 5
  4. 0
Afficher la réponseMasquer la réponse
Réponse : B
La clé entière 0 sélectionne l’étiquette d’index 0, dont la valeur est 13. La première valeur affichée est 8, mais elle se trouve à la position 0 et porte l’étiquette 2. Pour demander la première valeur par position, utilise s.iloc[0] ; les clés entières entre crochets restent des étiquettes.

Question 2 sur 10

Une colonne contient [4.0, NaN, 9.0] et représente des nombres entiers d’articles. Quel type de données peut conserver la valeur manquante tout en stockant les effectifs connus comme des entiers ?
  1. int
  2. "bool"
  3. "str"
  4. "Int64"
Afficher la réponseMasquer la réponse
Réponse : D
Le type nullable Int64, avec un I majuscule, stocke des entiers et représente l’entrée manquante par <NA>. Le type ordinaire int64 n’a pas de marqueur de valeur manquante et ne peut pas convertir ce NaN. Le texte conserverait un affichage des entrées, mais ne stockerait pas des effectifs sous forme d’entiers numériques.

Question 3 sur 10

Un tableau possède les étiquettes de lignes uniques [30, 10, 20]. Quelle ligne df.loc[10] sélectionne-t-il ?
  1. La ligne d’étiquette 10, actuellement deuxième.
  2. La première ligne, à la position zéro.
  3. La dernière ligne, à la position deux.
  4. La dixième ligne, si elle existe.
Afficher la réponseMasquer la réponse
Réponse : A
loc interprète 10 comme une étiquette d’index et sélectionne donc la deuxième ligne affichée. Il ne compte pas dix positions à partir du début. L’emplacement de la ligne peut changer après un tri, mais son étiquette reste la même tant que l’index n’est pas modifié explicitement.

Question 4 sur 10

df contient les catégories ["A", "B", "A", "B"] et les masses [3, 7, 9, 4]. Quelles étiquettes satisfont (df["category"] == "A") | (df["mass_kg"] > 6) avec l’index par défaut ?
  1. L’étiquette 2 seulement.
  2. Les étiquettes 0 et 2 seulement.
  3. Les étiquettes 0, 1 et 2.
  4. Les étiquettes 1 et 2 seulement.
Afficher la réponseMasquer la réponse
Réponse : C
Le masque « ou » conserve les lignes qui remplissent au moins l’une des deux conditions. Les lignes 0 et 2 appartiennent à la catégorie A, et les lignes 1 et 2 dépassent 6 kg : leur union est donc 0, 1 et 2. Ne conserver que l’étiquette 2 exigerait les deux conditions et utiliserait & au lieu de |.

Question 5 sur 10

Les quantités sont [2.0, 5.0, NaN] et les prix unitaires [7.0, 3.0, 9.0]. Quelle est la moyenne par défaut de leurs produits calculés ligne par ligne ?
  1. Environ 9.67
  2. 14.5
  3. 29.0
  4. NaN
Afficher la réponseMasquer la réponse
Réponse : B
Les produits sont 14, 15 et NaN. La moyenne par défaut ignore le résultat manquant : 29 est donc divisé par deux, ce qui donne 14,5. Diviser par les trois lignes donne environ 9,67 et traiterait un chiffre d’affaires inconnu comme si sa contribution était un zéro enregistré.

Question 6 sur 10

Une colonne numérique contient [5.0, NaN, 2.0]. Dans un tri décroissant des valeurs avec les paramètres par défaut, où apparaît NaN ?
  1. Avant les deux valeurs numériques.
  2. Entre les deux valeurs numériques.
  3. Après les deux valeurs numériques.
  4. À la même position qu’auparavant.
Afficher la réponseMasquer la réponse
Réponse : C
Les valeurs manquantes vont en dernier par défaut, même lorsque les valeurs sont triées par ordre décroissant. L’ordre est 5, 2, puis NaN. Inverser le sens du tri modifie l’ordre des nombres, mais ne place pas les valeurs manquantes au début ; cela nécessite na_position="first".

Question 7 sur 10

a = pd.Series([6, 9], index=["east", "west"]) et b = pd.Series([4, 7], index=["west", "east"]). Que valent (a + b).loc["east"] et (a + b).loc["west"] ?
  1. 13 et 13
  2. 10 et 16
  3. 6 et 9
  4. 7 et 4
Afficher la réponseMasquer la réponse
Réponse : A
Les calculs sur les objets Series associent les étiquettes d’index. East combine 6 avec 7 et west combine 9 avec 4 : les deux sommes valent donc 13. Associer les premières entrées affichées donnerait 10 et 16, mais ces entrées portent des étiquettes différentes et ne sont pas associées par pandas.

Question 8 sur 10

Deux lignes comportent des cellules manquantes : l’une a des valeurs manquantes dans trois colonnes et l’autre dans une colonne. Que renvoie df.isna().any(axis=1).sum() ?
  1. 4
  2. 3
  3. 1
  4. 2
Afficher la réponseMasquer la réponse
Réponse : D
any(axis=1) réduit chaque ligne à une réponse : contient-elle au moins une valeur manquante ? Les deux lignes concernées valent True, donc la somme vaut 2. Additionner les nombres de valeurs manquantes de toutes les colonnes donnerait quatre cellules, mais cette expression ne compte chaque ligne qu’une fois.

Question 9 sur 10

Les noms sont ["Zoe", "Ari", "Bo", "Dee"] et les scores [8, 8, 10, 8]. Après un tri par score décroissant et par nom croissant, puis la sélection des deux premières lignes, quels noms apparaissent dans l’ordre ?
  1. Bo, Zoe.
  2. Bo, Ari.
  3. Ari, Bo.
  4. Ari, Dee.
Afficher la réponseMasquer la réponse
Réponse : B
Le score de 10 place Bo en premier. Les trois scores de 8 sont ensuite triés par nom, avec Ari avant Dee et Zoe : la deuxième ligne sélectionnée est donc Ari. Garder Zoe en deuxième position conserverait l’ordre d’entrée des ex æquo au lieu d’appliquer la clé secondaire indiquée.

Question 10 sur 10

s contient ["A", "B", "C", "A", "B"]. Après s.replace({"C": "B"}), quels sont le mode et sa fréquence relative ?
  1. B et 0,6.
  2. A et 0,4.
  3. B et 0,5.
  4. A et 0,6.
Afficher la réponseMasquer la réponse
Réponse : A
Remplacer C par B donne les effectifs A 2 et B 3 : B est donc le mode. Sa fréquence relative est de trois sur cinq, soit 0,6. Le dénominateur reste cinq, car replace conserve chaque observation ; la transformation ne supprime pas la ligne qui contenait C.
Série 2 : Choisir la bonne opération pandas10 Questions Pratiques

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

Question 1 sur 10

Un DataFrame comporte 7 lignes et 4 colonnes. Que vaut sa .size ?
  1. 7
  2. 4
  3. 28
  4. 11
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un tableau de 11 lignes comporte une colonne avec 8 valeurs non manquantes. Combien de valeurs manquent dans cette colonne ?
  1. 3
  2. 8
  3. 11
  4. 19
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

df comporte cinq lignes. Quelles positions de lignes sont sélectionnées par df.iloc[1:4] ?
  1. Les positions 1, 2, 3 et 4.
  2. Les positions 1, 2 et 3.
  3. Les positions 0, 1 et 2.
  4. Les positions 2, 3 et 4.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Dans pandas 3, chosen = df[df["active"]] est suivi de chosen["score"] = 0. Que devient df ?
  1. Tous ses scores deviennent nuls.
  2. Seuls ses scores actifs deviennent nuls.
  3. Seuls ses scores inactifs deviennent nuls.
  4. Les valeurs de ses scores restent inchangées.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Pour les valeurs [4, 6, 9], quelles étiquettes sont produites par np.where(s >= 6, "large", "small") ?
  1. ["small", "small", "large"]
  2. ["small", "large", "large"]
  3. ["large", "small", "small"]
  4. ["large", "large", "small"]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Les scores [90, 70, 90, 50] sont classés avec method="min", ascending=False. Quels rangs obtient-on dans l’ordre initial des lignes ?
  1. [1, 3, 1, 4]
  2. [1, 2, 1, 3]
  3. [1.5, 3, 1.5, 4]
  4. [2, 3, 2, 4]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un fichier séparé par des points-virgules contient code;mass_kg, puis 007;1,5 et 012;2,0. Quel chargement conserve les codes et permet de calculer une masse moyenne numérique ?
  1. pd.read_csv("loads.csv", sep=";", decimal=".", dtype={"code": str})
  2. pd.read_csv("loads.csv", sep=";", decimal=",", dtype={"code": int})
  3. pd.read_csv("loads.csv", sep=";", decimal=",", dtype={"code": str})
  4. pd.read_csv("loads.csv", sep=",", decimal=",", dtype={"code": str})
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

df possède l’index [10, 20, 30] et les chiffres d’affaires [12.0, 24.0, 36.0]. Une nouvelle colonne reçoit df.loc[df["revenue"] > 15, "revenue"] / 2. Quelle est la somme par défaut de cette nouvelle colonne ?
  1. 36.0
  2. 18.0
  3. NaN
  4. 30.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Les valeurs [12, 4, 12, 8] sont classées par ordre croissant avec la méthode par défaut et pct=True. Quel rang centile reçoit chaque valeur 12 ?
  1. 1.0
  2. 0.75
  3. 0.875
  4. 0.5
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

df.index vaut ["a", "b", "a"]. Quel est le type de df.loc["a"] ?
  1. Un DataFrame contenant deux lignes.
  2. Un objet Series avec seulement la première ligne.
  3. Un objet Series contenant la dernière ligne.
  4. Un scalaire comptant les lignes correspondantes.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 3 : Vérifier les lignes, les types et les calculs10 Questions Pratiques

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

Question 1 sur 10

df possède un index sans nom [40, 60]. Que fait df.reset_index() de ces étiquettes ?
  1. Les supprime et conserve les autres colonnes.
  2. Les conserve comme nouvelles étiquettes de lignes.
  3. Les utilise pour renommer la première colonne.
  4. Les conserve dans une colonne index.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un fichier n’a pas d’en-tête et commence par 501,Sensor. Comment le charger avec les colonnes id et device sans perdre ce premier enregistrement ?
  1. pd.read_csv("devices.csv", header=0, names=["id", "device"])
  2. pd.read_csv("devices.csv", header=None, names=["id", "device"])
  3. pd.read_csv("devices.csv", skiprows=1, names=["id", "device"])
  4. pd.read_csv("devices.csv", index_col=0, names=["id", "device"])
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Avec un index ordonné [11, 12, 13, 14], quelle est la forme de df.loc[12:14, ["mass_kg"]] ?
  1. (3, 1)
  2. (2, 1)
  3. (1, 3)
  4. (3,)
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

cutoff = 6. Comment query peut-il sélectionner les lignes dont mass_kg dépasse cette variable Python ?
  1. df.query("mass_kg > cutoff")
  2. df.query("@mass_kg > cutoff")
  3. df.query("mass_kg > @cutoff")
  4. df.query("mass_kg > 6@")
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Que devient 14 dans pd.Series([-2, 6, 14]).clip(lower=0, upper=10) ?
  1. Il devient 10.
  2. Il est supprimé.
  3. Il devient 0.
  4. Il reste 14.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Un objet Series textuel contient ["L", "M", "L", None]. Quelle proportion value_counts(normalize=True) attribue-t-il à L par défaut ?
  1. 0.5
  2. 0.75
  3. 2.0
  4. Environ 0.667
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

a = pd.Series([5, 8], index=["u", "v"]) et b = pd.Series([2, 4], index=["v", "w"]). Soit c = a.add(b, fill_value=0). Que vaut c[c > 4].sum() ?
  1. 10.0
  2. 15.0
  3. 19.0
  4. 9.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une importation de six lignes contient six identifiants distincts non manquants et quatre relevés de température présents totalisant 28 °C. Un rapport affirme qu’un identifiant se répète et que la moyenne est d’environ 4,67 °C. Quel rapport corrigé correspond aux données ?
  1. Un identifiant se répète ; deux relevés manquent ; la moyenne est de 7 °C.
  2. Les identifiants sont uniques ; aucun relevé ne manque ; la moyenne est de 4,67 °C.
  3. Les identifiants sont uniques ; deux relevés manquent ; la moyenne est de 7 °C.
  4. Un identifiant se répète ; aucun relevé ne manque ; la moyenne est de 4,67 °C.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

df possède l’index [4, 8, 12] et les prix flottants [10.0, 20.0, 30.0]. Un masque sélectionne les étiquettes 4 et 12. Après df.loc[mask, "price"] = pd.Series([7.0, 9.0], index=[12, 4]), quels sont les prix dans l’ordre initial des lignes ?
  1. [7.0, 20.0, 9.0]
  2. [9.0, 20.0, 7.0]
  3. [9.0, NaN, 7.0]
  4. [NaN, 20.0, NaN]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Les scores sont [11, 9, 9, 6]. Quels sont le nombre de lignes et le plus petit score renvoyés par df.nlargest(2, "score", keep="all") ?
  1. 2 lignes ; plus petit score : 9.
  2. 4 lignes ; plus petit score : 6.
  3. 1 ligne ; plus petit score : 11.
  4. 3 lignes ; plus petit score : 9.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 4 : Suivre plusieurs opérations combinées10 Questions Pratiques

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

Question 1 sur 10

df = pd.DataFrame({"a": [2, 5], "b": [7, 1]}). Quelles valeurs df.sum(axis=1) renvoie-t-il dans l’ordre des lignes ?
  1. [9, 6]
  2. [7, 8]
  3. [3, 12]
  4. [2, 5, 7, 1]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

s = pd.Series(["8", "bad", "2.5"]). Quelles sont les valeurs après pd.to_numeric(s, errors="coerce") ?
  1. [8.0, 0.0, 2.5]
  2. [8, "bad", 2.5]
  3. [8.0, NaN, 2.5]
  4. [8, NaN, 2]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un tableau possède l’index [7, 2, 9] et les valeurs de x [4, 12, 8]. Soit d = df.sort_values("x", ascending=False). Que vaut d.iloc[:2]["x"].sum() - d.loc[7, "x"] ?
  1. 20
  2. 8
  3. 24
  4. 16
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Pour les masses [2, 5, 8], quelles valeurs satisfont .between(2, 8, inclusive="neither") ?
  1. Les valeurs 2 et 5.
  2. La valeur 5 seulement.
  3. Les valeurs 5 et 8.
  4. Les trois valeurs.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

df possède l’index [5, 9, 12], les quantités [2, 3, 4] et les prix [6, 5, 2]. Le code affecte le chiffre d’affaires, conserve ceux supérieurs à 10, puis affecte pd.Series([20.0], index=[9]) à adjusted. Quelle est la moyenne par défaut de adjusted ?
  1. 10.0
  2. 13.5
  3. 20.0
  4. NaN
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

Les relevés sont [3.0, 7.0, NaN, 8.0]. Quelles sont leur moyenne et leur nombre de valeurs non manquantes par défaut ?
  1. 4.5 et 4
  2. 6.0 et 3
  3. 6.0 et 4
  4. 4.5 et 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

df = pd.DataFrame({"a": [2, 6], "b": [5, 3]}, index=[8, 4]). Après df = df.T, que valent df.shape et df.loc["b"].sum() ?
  1. (2, 2) et 8
  2. (2, 2) et 9
  3. (2, 2) et 7
  4. (4, 1) et 8
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un objet Series contient "1,500", "800", "unknown", "200", sans valeur manquante initiale. Après suppression des virgules, coercition numérique et calcul de la moyenne par défaut, quelles sont la moyenne et le nombre de nouvelles valeurs manquantes ?
  1. 625.0 ; une nouvelle valeur manquante.
  2. Environ 833.33 ; aucune nouvelle valeur manquante.
  3. 625.0 ; aucune nouvelle valeur manquante.
  4. Environ 833.33 ; une nouvelle valeur manquante.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un objet Series de type float64 contient [2.0, NaN, 8.0, 5.0]. Quelle est la somme des valeurs sélectionnées par s.notna() & (s != 5) & (s < 8) ?
  1. 10.0
  2. 7.0
  3. 2.0
  4. NaN
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Les relevés sont [1, 2, 3, 4, 40] mm. La moyenne est de 10 mm et la médiane de 3 mm. Pourquoi la médiane décrit-elle mieux un relevé typique ici ?
  1. La médiane additionne les cinq relevés avant de diviser.
  2. La moyenne donne un poids différent à chaque relevé.
  3. La médiane est toujours égale au plus petit relevé.
  4. Le relevé élevé de 40 mm tire la moyenne vers le haut.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Série 5 : Résoudre des problèmes d’alignement et d’indicateurs10 Questions Pratiques

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

Question 1 sur 10

Un tableau indexé par les identifiants uniques 81 et 82 est enregistré sous le nom df. La ligne suivante est df.reset_index(). Pourquoi df.loc[0] échoue-t-il encore ?
  1. La réinitialisation a conservé 81 comme première étiquette.
  2. Le nouvel index commence à la position 1.
  3. Le tableau renvoyé n’a pas été affecté.
  4. La colonne d’identifiants empêche la recherche par étiquette.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Un fichier utilise des points-virgules entre les champs et des points décimaux dans les nombres. Quelle option modifie le séparateur de champs ?
  1. decimal=";"
  2. sep=";"
  3. header=";"
  4. index_col=";"
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Un tableau de quatre lignes porte les étiquettes [8, 3, 6, 1]. Quelles étiquettes restent dans df.iloc[-2:][["x"]] ?
  1. 8 et 3.
  2. 3 et 6.
  3. 1 et 6.
  4. 6 et 1.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

df possède l’index ["k", "m", "p"], les valeurs de a [4, 8, 12] et celles de b [3, 1, 5]. Soit d = df.loc[(df["a"] >= 8) & (df["b"] < 4), ["a", "b"]]. Que vaut d.sum(axis=1).iloc[0] ?
  1. 9
  2. 7
  3. 17
  4. 24
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Les noms d’appareils sont ["Probe A", "sensor", None, "PROBE B"]. Quelles étiquettes de lignes par défaut satisfont .str.contains("probe", case=False, na=False) ?
  1. 0 et 3.
  2. L’étiquette 0 seulement.
  3. 0, 2 et 3.
  4. L’étiquette 3 seulement.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 6 sur 10

df possède des étiquettes par défaut et les prix flottants [8.0, 12.0, 18.0]. On définit mask = df["price"] >= 12, puis on exécute df.loc[mask, "price"] = pd.Series([9.0], index=[2]). Que renvoie df["price"].count() ?
  1. 3
  2. 2
  3. 1
  4. 0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 7 sur 10

Un tableau possède l’index par défaut et les scores [60, 90, 90, 75] dans l’ordre des lignes. Un rang dense décroissant est affecté à place, puis le tableau est trié par place croissante avec un tri stable. Quelles étiquettes de lignes d’origine apparaissent en premier ?
  1. 0 et 3.
  2. 2 et 1.
  3. 1 et 3.
  4. 1 et 2.
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

s = pd.Series(["X", "Y", "X", "Z"]). Après t = s.map({"X": 4, "Y": 10}), que valent t.count() et t.mean() ?
  1. 4 et 4.5
  2. 3 et 4.5
  3. 3 et 6.0
  4. 4 et 6.0
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Un objet Series pandas s contient [2.0, 4.0, 6.0]. Que valent s.std() et np.std(s.to_numpy()), arrondis à trois décimales ?
  1. 1.633 et 2.000
  2. 4.000 et 2.667
  3. 2.000 et 2.000
  4. 2.000 et 1.633
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

df contient x [1, 2, 3, 4], y [100, 6, 4, 2] et z [5, 5, 5, 5]. Après df.loc[df["x"] > 1, ["x", "y", "z"]].corr(), quelles valeurs apparaissent pour la corrélation de x avec y et celle de z avec lui-même ?
  1. 1.0 et NaN
  2. -1.0 et 1.0
  3. -1.0 et NaN
  4. -1.0 et 0.0
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

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

A

Accesseur dt
L’accesseur de dates et heures dt fournit des composantes ou des méthodes de date et d’heure pour un objet Series dont les valeurs sont de type date et heure.
Après conversion des dates, .dt.day_name() renvoie le jour de la semaine associé à chaque date de commande.
Accesseur str
L’accesseur textuel str fournit des méthodes de chaînes vectorisées sur un objet Series textuel, notamment la conversion en majuscules et le comptage des caractères.
orders["product"].str.len() calcule la longueur de chaque nom de produit enregistré.
Affectation chaînée
Une affectation chaînée tente de mettre à jour des valeurs par des sélections successives et ne modifie jamais le tableau d’origine dans pandas 3.
Un tableau filtré suivi d’une autre sélection de colonne ne peut pas servir à mettre à jour son tableau parent.
Affectation d’un scalaire
Une affectation d’un scalaire remplit toutes les cellules ciblées avec une valeur fournie, sans nécessiter une valeur distincte pour chaque ligne sélectionnée.
Affecter zéro à une sélection loc donne zéro à chaque cellule sélectionnée et laisse les autres lignes inchangées.
Agrégation
Une agrégation réduit un ensemble de valeurs à des indicateurs ; agg permet de demander plusieurs statistiques à la fois.
agg(["mean", "max"]) indique deux statistiques différentes pour chaque colonne numérique sélectionnée.
Alignement des étiquettes
L’alignement des étiquettes consiste à associer les valeurs pandas par leurs étiquettes d’index lors des opérations, même lorsque leurs positions diffèrent.
Additionner des objets Series dont les villes sont indexées dans des ordres différents associe quand même chaque ville à elle-même.
Aperçu
Un aperçu est une petite sélection d’enregistrements affichée pour vérifier les valeurs visibles et la structure avant d’analyser le tableau complet.
head(3) permet de vérifier l’en-tête et les trois premiers enregistrements sans afficher toutes les lignes.
Application d’une fonction ligne par ligne
L’application d’une fonction ligne par ligne transmet chaque ligne d’un DataFrame à une fonction avec axis=1, ce qui permet à la fonction de lire plusieurs colonnes.
Une fonction personnalisée appliquée aux lignes peut utiliser la quantité et le prix, bien que la multiplication des colonnes soit plus rapide pour calculer le chiffre d’affaires.
assign
La méthode assign renvoie un DataFrame contenant des colonnes nouvelles ou remplacées et laisse son tableau d’entrée inchangé.
Une expression lambda dans assign peut calculer une colonne de taxe à partir du chiffre d’affaires à ce stade d’un enchaînement de méthodes.
at
L’indexeur at sélectionne une seule cellule à partir de ses étiquettes de ligne et de colonne et fournit une forme concise de recherche scalaire par étiquette.
orders.at[2, "product"] lit le produit à l’étiquette 2 dans un tableau de commandes doté de l’index par défaut.
Axe
Un axe est une direction dans un tableau pandas : l’axe 0 parcourt les lignes et l’axe 1 parcourt les colonnes pour les réductions par ligne.
df.sum(axis=1) additionne les colonnes numériques sélectionnées dans chaque ligne et donne un total par ligne.

B

between
La méthode between vérifie si chaque valeur se situe entre une borne inférieure et une borne supérieure, en incluant les deux bornes par défaut.
between(5, 20, inclusive="left") inclut 5 mais exclut 20 de l’intervalle de prix.

C

Clé de tri
Une clé de tri est la colonne ou l’étiquette dont les valeurs déterminent l’ordre ; lorsque plusieurs clés sont fournies, les premières sont prioritaires.
Les scores peuvent être la clé de tri principale, les noms ordonnant les enregistrements qui ont le même score.
Coercition
La coercition numérique convertit les valeurs numériques qui peuvent être analysées et remplace les entrées invalides par des valeurs manquantes au lieu de s’arrêter.
Convertir "7", "unknown", "2.5" avec errors réglé sur coerce crée une nouvelle entrée manquante.
Colonne
Une colonne est une suite étiquetée représentant une variable dans un DataFrame, stockée sous forme d’objet Series avec son propre type de données.
La colonne quantity contient un nombre ou une entrée manquante pour chaque commande du tableau.
Colonne calculée
Une colonne calculée stocke des valeurs obtenues à partir de données existantes, par exemple par un calcul ligne par ligne entre deux colonnes numériques.
Multiplier quantity par unit_price crée revenue tout en gardant chaque résultat avec sa commande.
Conversion de type
Une conversion de type transforme les valeurs vers un type de données choisi afin que la colonne permette les opérations exigées par son sens.
Convertis les dates textuelles avant de demander .dt.month, puis réaffecte l’objet Series converti.
Copie à l’écriture
La copie à l’écriture est le comportement de pandas 3 selon lequel un objet Series ou DataFrame dérivé agit indépendamment lorsque ses valeurs changent.
Modifier une sélection enregistrée de commandes Home issue d’un tableau de commandes modifie cette sélection tout en laissant le tableau de commandes inchangé.
Corrélation de Pearson
La corrélation de Pearson mesure le sens et la force d’une liaison linéaire entre variables numériques sur une échelle allant de −1 à 1.
Un coefficient négatif entre température et pluie décrit une tendance des jours les plus chauds à être moins pluvieux.
Corrélation de Spearman
La corrélation de Spearman mesure une liaison à l’aide des rangs et convient aux relations toujours croissantes ou toujours décroissantes.
Une liaison courbe constamment croissante peut être décrite à l’aide des rangs sans supposer qu’elle suit une droite.
Correspondance par dictionnaire
La correspondance par dictionnaire traduit chaque entrée par une recherche de clé vers valeur et rend manquante une entrée non répertoriée avec map.
Associer chaque catégorie à un code exige une clé pour chaque catégorie dont le code doit rester connu.
CSV
Le CSV est un format textuel d’enregistrements tabulaires dont les champs sont séparés par un séparateur, généralement une virgule, et qui comporte souvent un en-tête.
Un champ vide entre deux séparateurs peut représenter une quantité non enregistrée dans une commande.

D

DataFrame
Un DataFrame est un tableau pandas à deux dimensions dont les colonnes partagent un index de lignes et peuvent chacune avoir un type de données différent.
Un tableau de commandes stocke les produits sous forme de texte, les quantités numériques et les prix dans des colonnes distinctes.
Détection des enregistrements en double
La détection des enregistrements en double marque les lignes répétées ou les valeurs répétées dans des colonnes sélectionnées, en laissant généralement la première occurrence non marquée.
Dans une colonne de produits où Notebook apparaît plusieurs fois, duplicated(subset="product") marque les entrées Notebook ultérieures même si chaque identifiant de commande est différent.
Diffusion d’un scalaire
La diffusion d’un scalaire applique une valeur fournie à toute une opération sur une colonne ou remplit une colonne ciblée avec cette valeur.
Diviser chaque chiffre d’affaires par le même total connu donne la part de chaque commande dans ce total.

E

Effectifs par valeur
Les effectifs par valeur indiquent combien de fois chaque valeur distincte apparaît, généralement de la plus fréquente à la moins fréquente.
Les effectifs par catégorie montrent si la plupart des commandes enregistrées sont de catégorie Stationery, Home ou Bags.
En-tête
Un en-tête est la ligne contenant les noms des colonnes d’un tableau, que pandas lit normalement sur la première ligne d’un CSV.
Utilise header=None lorsque la première ligne contient un véritable enregistrement qui doit rester dans les données.
Entier nullable
Un type entier nullable stocke des entiers avec des entrées manquantes, représentées par dans le type pandas Int64.
Une colonne d’effectifs contenant une case vide peut utiliser "Int64" au lieu d’échouer lors d’une conversion en int ordinaire.
Erreur de calcul en virgule flottante
Une erreur de calcul en virgule flottante est une petite différence due à la représentation et au calcul de valeurs décimales dans un stockage binaire.
Un calcul de taxe peut afficher 1.9000000000000001, qui peut être arrondi à deux décimales.
ET logique élément par élément
Le ET logique élément par élément combine des masques avec & et donne True pour une ligne uniquement lorsque les deux conditions correspondantes valent True.
Une commande Home coûtant plus de 10 doit satisfaire à la fois les comparaisons sur la catégorie et sur le prix.

É

Écart-type
L’écart-type mesure la dispersion autour de la moyenne dans les unités d’origine ; pandas utilise par défaut le dénominateur d’échantillon.
L’écart-type des températures se mesure en degrés Celsius, contrairement à la variance qui se mesure en degrés au carré.
Échantillon aléatoire
Un échantillon aléatoire est une sélection réalisée par une procédure aléatoire ; une valeur fixe de random_state rend le choix reproductible sur les mêmes données.
sample(3, random_state=0) est utile pour vérifier des lignes situées ailleurs qu’au début ou à la fin d’un tableau.
Écrêtage
L’écrêtage ramène les valeurs à des bornes inférieure ou supérieure données et conserve chaque observation au lieu de supprimer les lignes hors de ces bornes.
Écrêter les prix unitaires à 20 transforme une valeur de 35 en 20 tout en conservant le même enregistrement de commande.

F

Filtrage
Le filtrage conserve les observations qui satisfont une condition sur les lignes, tout en préservant leurs valeurs et leurs étiquettes d’index existantes.
Après sélection des commandes Stationery, les étiquettes d’origine peuvent présenter des sauts au lieu de recommencer à zéro.
Forme
La forme d’un DataFrame est un tuple de deux éléments qui indique d’abord son nombre de lignes, puis son nombre de colonnes.
Un tableau contenant six commandes et quatre variables enregistrées a pour forme (6, 4) et comporte 24 cellules.
Fréquence relative
Une fréquence relative est l’effectif d’une valeur divisé par le nombre de toutes les entrées incluses ; elle exprime une proportion.
Trois entrées Stationery parmi six catégories présentes donnent 0,5, soit 50 % après multiplication par 100.

I

iat
L’indexeur iat sélectionne une seule cellule par ses positions de ligne et de colonne comptées à partir de zéro, sans les interpréter comme des étiquettes.
orders.iat[2, 2] lit la cellule située à la troisième ligne et à la troisième colonne d’un tableau de commandes.
iloc
L’indexeur iloc sélectionne les lignes et les colonnes par positions entières comptées à partir de zéro, indépendamment de leurs étiquettes ou de leurs noms.
.iloc[-1] renvoie la dernière ligne même si son étiquette d’index est un numéro de commande comme 1006.
Index
Un index est l’ensemble des étiquettes associées à un objet Series ou aux lignes d’un DataFrame, utilisées pour identifier les entrées.
Un index de villes permet à population["Lima"] de demander la valeur d’une ville sans connaître sa position.
Inférence de type
L’inférence de type est le choix par pandas du type d’une colonne à partir de ses valeurs d’entrée lorsqu’aucun type explicite n’est fourni.
L’inférence numérique peut transformer l’identifiant "001" en 1 si son type n’est pas précisé comme textuel.
isin
La méthode isin crée un masque d’appartenance en vérifiant si chaque valeur figure dans un ensemble fourni de valeurs autorisées.
Tester l’appartenance d’une catégorie à ["Home", "Bags"] remplace deux comparaisons d’égalité reliées par « ou ».
isna
La méthode isna identifie les entrées manquantes en produisant True pour les valeurs manquantes et False pour les valeurs présentes à chaque position.
Un masque isna peut sélectionner la commande sans quantité sans rien comparer à NaN.

L

Liaison statistique
Une liaison statistique est une relation observée entre des variables ; une corrélation la décrit sans établir de mécanisme causal.
La corrélation entre température et pluie sur une semaine ne montre pas qu’une modification de la température provoquerait une modification des précipitations.
loc
L’indexeur loc sélectionne les lignes et les colonnes par étiquette et accepte des étiquettes individuelles, des listes, des tranches par étiquettes et des masques booléens.
Un index d’identifiants de commandes permet à .loc[1004, "product"] de sélectionner le produit d’une commande identifiée.

M

Marqueur de valeur manquante
Un marqueur de valeur manquante est un élément ou une valeur stockée qui indique qu’une entrée est absente et non connue.
na_values=["-"] indique au lecteur CSV qu’un tiret dans le fichier représente une entrée manquante.
Masque booléen
Un masque booléen est une suite de valeurs de vérité qui indique quelles entrées satisfont une condition et doivent être sélectionnées.
Comparer chaque prix à 10 crée un True ou un False pour chaque ligne de commande.
Matrice de corrélation
Une matrice de corrélation présente les corrélations entre chaque paire de variables et est symétrique ; les colonnes numériques dont les valeurs varient ont une corrélation de 1 avec elles-mêmes.
La case pluie-température est égale à la case température-pluie ; la corrélation d’une colonne constante avec elle-même donne NaN.
Médiane
La médiane est le milieu des données numériques ordonnées ; lorsque le nombre de valeurs enregistrées est pair, elle est la moyenne des deux valeurs centrales.
Une journée très pluvieuse peut tirer la moyenne hebdomadaire des précipitations au-dessus de la médiane, qui reste proche d’une journée sèche typique.
Mise à jour conditionnelle
Une mise à jour conditionnelle affecte de nouvelles valeurs aux cellules de lignes sélectionnées par une condition, généralement au moyen d’une seule affectation loc.
df.loc[mask, "price"] *= 0.9 applique une remise exactement aux lignes sélectionnées par le masque de mise à jour des prix.
Mode
Un mode est une valeur qui possède la fréquence la plus élevée dans un jeu de données ; pandas renvoie un objet Series, car plusieurs modes peuvent être ex æquo.
Si A et B apparaissent chacun trois fois et qu’aucune valeur n’apparaît plus souvent, mode renvoie les deux étiquettes.
Moyenne
La moyenne est le total des valeurs numériques enregistrées divisé par leur nombre, pandas ignorant les valeurs manquantes par défaut.
Pour calculer une quantité moyenne à partir de cinq effectifs enregistrés, il ne faut pas diviser leur total par les six lignes de commandes.

N

NaN
NaN est un marqueur de valeur manquante utilisé pour les données à virgule flottante et les données textuelles par défaut de pandas 3 ; ce n’est pas un zéro numérique connu.
Une quantité vide peut rendre manquant le chiffre d’affaires calculé correspondant, tandis que les chiffres d’affaires connus restent utilisables.
Nombre de valeurs distinctes
Le nombre de valeurs distinctes est le nombre de valeurs présentes différentes dans une colonne, renvoyé par nunique avec ses paramètres par défaut.
Six identifiants enregistrés distincts parmi six lignes indiquent que la colonne d’identifiants ne comporte aucune valeur répétée.
Nombre de valeurs non manquantes
Le nombre de valeurs non manquantes est le nombre d’entrées présentes dans une colonne ; il peut être comparé au nombre de lignes pour repérer les valeurs manquantes.
Cinq quantités non manquantes parmi six commandes signifient qu’une commande n’a pas de quantité enregistrée.

O

Observation
Une observation est le cas individuel enregistré dans une ligne d’un tableau bien organisé, ses variables étant enregistrées dans les colonnes.
Une ligne enregistre une commande, même lorsque son produit apparaît aussi dans la ligne d’une autre commande.
Opération vectorisée
Une opération vectorisée applique une expression à une suite ou à une colonne entière de valeurs sans boucle Python explicite sur les lignes.
Multiplier un objet Series de prix par 0,9 réduit chaque prix enregistré dans la même proportion.
Ordre croissant
L’ordre croissant place les plus petites valeurs avant les plus grandes ; c’est le sens par défaut du tri des valeurs et de l’index dans pandas.
Définis ascending=False lorsqu’un tableau de résultats doit afficher les scores les plus élevés en premier.
OU logique élément par élément
Le OU logique élément par élément combine des masques avec | et donne True pour une ligne lorsque l’une des conditions correspondantes, ou les deux, vaut True.
Une sélection des articles Home ou des prix supérieurs à 10 peut inclure des articles coûteux d’une autre catégorie.

P

Placement des valeurs manquantes
Le placement des valeurs manquantes précise où elles apparaissent dans un résultat trié, indépendamment du sens du tri numérique.
Un tri décroissant place toujours NaN en dernier, sauf si na_position="first" est demandé explicitement.
Position négative
Une position négative compte à rebours depuis la fin d’un axe, −1 désignant sa dernière entrée disponible.
La position −2 sélectionne l’avant-dernière colonne, quel que soit son nom.

Q

Quantile
Un quantile marque une position dans les données ordonnées pour une fraction comprise entre zéro et un ; pandas utilise l’interpolation par défaut.
quantile(0.25) peut donner un premier quartile situé entre deux températures mesurées dans une colonne de températures.
query
La méthode query filtre un DataFrame à l’aide d’une expression textuelle dans laquelle les noms de colonnes désignent directement leurs valeurs.
query("quantity >= 2 and unit_price < 5") peut exprimer clairement un filtre combiné sur les commandes.

R

Rang
Un rang est un nombre qui décrit la place d’une valeur dans les données ordonnées et qui est associé à la ligne d’origine sans la déplacer.
Les rangs décroissants permettent à l’enregistrement d’origine de chaque personne de porter une place fondée sur son score.
Rang centile
Un rang centile exprime un rang sous forme de fraction ; le classement par moyenne par défaut divise par le nombre de valeurs classées.
Un rang moyen de 4,5 parmi cinq valeurs non manquantes donne un rang centile de 0,9.
Rang dense
Un rang dense attribue des rangs consécutifs aux groupes de valeurs distinctes : les ex æquo ne laissent donc pas de saut avant le groupe suivant.
Deux gagnants ex æquo reçoivent le rang 1 et le score distinct suivant reçoit le rang 2 avec la méthode dense.
Rang minimal
Un rang minimal donne aux valeurs ex æquo le plus petit rang occupé et laisse des sauts pour les autres places occupées par les ex æquo.
Avec deux valeurs classées premières, la valeur distincte suivante reçoit le rang 3 avec la méthode min.
Rang moyen
Un rang moyen donne à chaque valeur ex æquo la moyenne des positions occupées par son groupe d’ex æquo dans l’ordre trié.
Deux scores les plus élevés égaux, occupant les places 1 et 2, reçoivent tous deux le rang décroissant 1,5.
Rang selon l’ordre d’apparition
Un rang selon l’ordre d’apparition départage les ex æquo selon leur ordre dans les données d’entrée et donne à chaque entrée ex æquo un rang distinct avec la méthode first.
Réordonner des lignes ex æquo peut modifier leurs rangs avec la méthode first même si leurs scores restent inchangés.
RangeIndex
Un RangeIndex est une suite d’étiquettes de lignes entières fournie par défaut, qui commence généralement à zéro et augmente de un en un.
Après un filtrage, reset_index(drop=True) remplace les étiquettes conservées par un nouvel index par défaut.
Recherche de motif textuel
Une recherche de motif textuel teste un motif de chaîne contre chaque entrée textuelle, par exemple en cherchant dans les valeurs avec str.contains.
Chercher "note" avec case=False trouve Notebook même si son N est une majuscule.
Réduction booléenne
Une réduction booléenne combine plusieurs valeurs de vérité en un seul résultat, par exemple pour savoir si au moins une entrée ou si toutes les entrées valent True.
La méthode .any() d’un masque peut indiquer si au moins une commande a une quantité manquante.
Remplacement
Le remplacement modifie les valeurs indiquées tout en conservant les valeurs non répertoriées, comme le fait l’opération replace sur un objet Series.
Dans une colonne contenant les catégories Bags, Home et Stationery, remplacer Bags par Luggage laisse les étiquettes Home et Stationery inchangées.
rename
La méthode rename renvoie un objet dont certaines étiquettes sont modifiées selon une correspondance, les autres restant en place.
rename(columns={"unit_price": "price"}) modifie le nom d’une colonne sans changer ses valeurs.
Répertoire de travail
Le répertoire de travail est le dossier à partir duquel Python résout les chemins relatifs lorsqu’il ouvre des fichiers tels qu’un CSV.
Un nom de fichier valide peut tout de même déclencher une FileNotFoundError si Python s’exécute dans un autre dossier.
reset_index
La méthode reset_index renvoie un tableau doté d’un nouvel index de lignes par défaut et conserve l’ancien index dans une colonne, sauf s’il est supprimé.
Un index nommé d’identifiants de commandes redevient une colonne order_id après un simple reset_index().

S

Scalaire
Un scalaire est une valeur unique renvoyée lorsqu’une sélection identifie une cellule plutôt qu’un objet Series ou un DataFrame.
Sélectionner une étiquette de ligne unique et un nom de colonne renvoie un nom de produit sous forme de scalaire.
Sélecteur de colonnes
Un sélecteur de colonnes indique les variables qu’une sélection à deux axes doit renvoyer, en utilisant des étiquettes avec loc et des positions avec iloc.
Un masque peut choisir les lignes tandis que ["product", "unit_price"] choisit les colonnes à afficher.
Sélection conditionnelle
La sélection conditionnelle avec np.where choisit un résultat pour les entrées True et un autre pour les entrées False d’une condition.
Un seuil de prix peut produire les étiquettes high et low sans écrire de boucle Python sur les lignes.
Sélection des n plus grandes valeurs
Une sélection des n plus grandes valeurs récupère les lignes aux valeurs les plus élevées et peut inclure tous les ex æquo au seuil lorsque keep vaut all.
nlargest(1, "points", keep="all") renvoie deux lignes si deux personnes partagent le score le plus élevé.
Séparateur de champs
Un séparateur de champs est le caractère qui sépare les champs d’un enregistrement textuel ; il est indiqué avec sep lorsque pandas lit un fichier CSV.
Un fichier délimité par des points-virgules nécessite sep=";", même si les nombres dans ses champs utilisent des virgules décimales.
Series
Un objet Series est une structure pandas à une dimension qui associe chaque valeur stockée à une étiquette d’index et possède un seul type de données.
Un objet Series de pluie peut associer des relevés en millimètres aux étiquettes Mon, Tue et Wed.
set_index
La méthode set_index renvoie un tableau qui utilise une colonne choisie comme étiquettes de lignes et supprime cette colonne par défaut.
orders.set_index("order_id") transforme un numéro de commande en étiquette utilisée pour les recherches ultérieures de lignes.
Somme cumulée
Une somme cumulée est un total progressif qui comporte une valeur accumulée à chaque position ; elle est renvoyée par la méthode cumsum.
Les sommes cumulées des précipitations quotidiennes indiquent la quantité de pluie accumulée jusqu’à chaque jour de la semaine.

T

Tranche par étiquettes
Une tranche par étiquettes sélectionne un intervalle à l’aide d’étiquettes initiale et finale et inclut les deux bornes sur un index ordonné adapté.
Sur un index d’étiquettes de commandes, .loc[1002:1004] inclut les trois étiquettes 1002, 1003 et 1004.
Tranche par positions
Une tranche par positions sélectionne un intervalle à partir d’une position initiale incluse jusqu’à la position finale indiquée, qui est exclue.
.iloc[1:3] renvoie les positions 1 et 2 et peut différer d’une tranche loc à bornes incluses.
Tri stable
Un tri stable conserve l’ordre relatif initial des entrées ex æquo selon la valeur de tri, lorsqu’il est demandé pour un tri sur une colonne.
kind="stable" conserve deux scores égaux dans leur ordre précédent au lieu d’imposer une nouvelle règle pour les ex æquo.
Type catégoriel
Le type catégoriel représente les étiquettes répétées à l’aide d’un ensemble de catégories et de leurs codes, ce qui économise généralement de la mémoire dans les grands tableaux.
Une colonne catégorielle non ordonnée refuse min() même lorsque ses étiquettes affichées sont du texte ordinaire.
Type de données
Un type de données est le type de stockage d’un objet Series ou d’une colonne ; il détermine les valeurs qu’il peut contenir et les opérations qu’il prend en charge.
Une colonne de quantités peut utiliser float64 lorsqu’un enregistrement comporte une quantité vide lue comme NaN.

U

Unicité de l’index
L’unicité de l’index signifie que chaque étiquette de ligne n’apparaît qu’une fois, ce qui permet à une étiquette de servir d’identifiant de ligne sans ambiguïté.
Vérifie .index.is_unique avant de t’attendre à ce qu’un identifiant de commande renvoie exactement une ligne.

V

Variable de requête
Une variable de requête est une valeur Python extérieure désignée avec le préfixe @ afin de la distinguer des noms de colonnes.
Avec limit = 5, query("unit_price > @limit") compare les prix à cette valeur Python.
Variance
La variance mesure la moyenne des écarts au carré par rapport à la moyenne avec le dénominateur choisi ; pandas utilise ddof=1 par défaut.
Il faut harmoniser ddof avant de comparer un calcul de dispersion de pandas aux résultats par défaut de NumPy.

À 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