Aller au contenu principal

Charger et examiner des DataFrames

Avant de lire une table, définissez les colonnes requises, le sens de leurs valeurs et les entrées à traiter comme manquantes. Ces règles constituent le schéma de la table. Dans l’exemple de commandes ci-dessous, les identifiants sont lus comme des chaînes pour conserver les zéros de "001", tandis que created_at est converti en date. Vérifiez ensuite que le DataFrame obtenu respecte ces règles.

from io import StringIO
import pandas as pd

orders = pd.read_csv(
StringIO("order_id,customer_id,created_at,amount\n"
"001,C1,2026-01-02,120.50\n"
"002,C2,2026-01-03,0\n"),
usecols=["order_id", "customer_id", "created_at", "amount"],
dtype={"order_id": "string", "customer_id": "string"},
parse_dates=["created_at"],
na_values=["", "NA", "null"],
)

Liste de contrôle de l'ingestion

  1. Identifiez le séparateur, l'encodage, les en-têtes, la convention décimale et les sentinelles d'absence.
  2. Sélectionnez les colonnes requises et précisez les types sémantiques lorsque l'inférence est risquée.
  3. Analysez les dates délibérément, puis localisez ou convertissez explicitement les fuseaux horaires.
  4. Examinez shape, head, info, les clés dupliquées et les valeurs manquantes.
  5. Vérifiez par assertion les invariants dont dépend l'étape suivante.
assert orders["order_id"].notna().all()
assert orders["order_id"].is_unique
assert orders["amount"].notna().all()
assert orders["amount"].ge(0).all()

Choix de l'index

Conservez l'index de plage par défaut, sauf si une clé métier facilite réellement la sélection ou l'alignement. Une clé peut rester une colonne ordinaire :

orders = orders.set_index("order_id", verify_integrity=True)
orders = orders.reset_index()

N'utilisez pas un champ métier non unique comme index uniquement parce qu'il ressemble à un identifiant.

Renommer à la frontière

Normalisez les noms une seule fois, près de l'ingestion :

orders = orders.rename(columns=str.strip)
orders.columns = orders.columns.str.lower().str.replace(" ", "_", regex=False)

Conservez une correspondance si les noms externes doivent rester traçables.

Limite de volume

Utilisez chunksize lorsque des blocs indépendants peuvent être agrégés progressivement. Si le processus exige des jointures ou redistributions répétées de la table entière au-delà de la mémoire, changer de moteur d'exécution vaut généralement mieux qu'une gestion complexe des blocs.

Contrats de lecture

read_csv accepte un chemin ou un objet fichier, comme le StringIO en mémoire ci-dessus. L’exemple renvoie un DataFrame de forme (2, 4) ; orders["order_id"].tolist() vaut ["001", "002"], sans perdre les zéros initiaux. Un chemin relatif part du répertoire de travail du processus. Avec chunksize, le résultat est un itérateur de DataFrames.

na_values complète la liste de marqueurs manquants par défaut. Si "NA" est un identifiant valide, utilisez keep_default_na=False et une liste explicite. parse_dates peut laisser une colonne non convertible sous forme textuelle : vérifiez son type ou imposez pd.to_datetime(..., errors="raise"). La normalisation des noms peut créer des doublons ; vérifiez ensuite orders.columns.is_unique. Les assertions conviennent aux exemples, mais Python peut les désactiver avec -O ; aux frontières contraignantes, levez explicitement des exceptions.

Sources

Explorer les liensOuvrir le réseau