Python & pandas / GUIDE PRATIQUE

pandas read_csv : séparateur, virgule décimale et codes avec zéros

Un import réussi ne se résume pas à un DataFrame qui s’affiche. Il faut conserver les codes, lire les montants comme prévu et décider si une chaîne comme NA est une valeur ou une absence.

produit;quantite;prixCafé;2;4,50produitquantiteprixCafé24,50

Exemple illustratif · les données du guide sont reproductibles

Écrire le petit contrat du fichier

Prenons un export de références, montants et zones. Le séparateur est le point-virgule ; les montants utilisent une virgule décimale ; les références conservent leurs zéros ; NA est ici un véritable code de zone. Ces quatre décisions font partie de l’exemple. Elles ne se déduisent pas de l’extension du fichier et doivent être remplacées par les règles de votre producteur.

ref;montant;zone
0012;12,50;NA
0013;7,20;EU

Avant d’écrire du code pour des milliers de lignes, vérifiez ce contrat sur quelques enregistrements connus. Un identifiant qui ressemble à un nombre reste parfois du texte. Une chaîne qui ressemble à une valeur manquante peut être un code légitime. Cette étape évite des corrections silencieuses après import.

Lire un exemple complet et reproductible

Cet exemple autonome utilise StringIO pour que vous puissiez l’exécuter sans télécharger de données. Le paramètre sep découpe les champs et decimal décrit la virgule des montants. Les types texte sont réservés aux références et aux zones ; la décision de conserver les chaînes NA est explicite.

from io import StringIO
import pandas as pd

contenu = "ref;montant;zone\n0012;12,50;NA\n0013;7,20;EU\n"
df = pd.read_csv(
    StringIO(contenu),
    sep=";",
    decimal=",",
    dtype={"ref": "string", "zone": "string"},
    keep_default_na=False,
)

assert df["ref"].tolist() == ["0012", "0013"]
assert df["zone"].tolist() == ["NA", "EU"]
assert abs(df["montant"].sum() - 19.7) < 1e-9

L’assertion sur le total tolère la représentation des nombres flottants. Elle ne transforme pas ces flottants en calcul monétaire exact. Pour des montants soumis à une précision contractuelle, choisissez une représentation adaptée à cette règle métier.

Séparer trois décisions de lecture

Le choix du séparateur répond à « où finit un champ ? ». Le symbole décimal répond à « comment lire un nombre ? ». Le dtype répond à « quel type souhaite-t-on pour cette colonne ? ». Confondre ces décisions donne souvent un tableau qui semble plausible mais ne calcule pas correctement. Par exemple, decimal ne remplace pas un mauvais sep et un dtype texte ne rend pas des champs absents présents.

La référence officielle de read_csv décrit ces paramètres et leurs interactions. En pratique, gardez votre appel lisible plutôt que de disperser les réparations dans plusieurs cellules de notebook. Un collègue doit pouvoir retrouver les règles de lecture en regardant ce bloc, puis les confronter au fichier reçu.

Décider ce que signifie une valeur manquante

Le paramètre keep_default_na=False de l’exemple préserve les marqueurs texte habituels au lieu de les reconnaître automatiquement comme absences. Cela convient à notre code NA, mais ce n’est pas un réglage universel : il change aussi le traitement des champs vides. Un fichier peut demander des règles différentes selon ses colonnes.

Ne pensez pas qu’un dtype texte suffit à préserver toutes les chaînes : la reconnaissance des valeurs manquantes constitue une étape distincte. Si certaines valeurs sont réellement absentes, documentez leur convention, puis utilisez les paramètres de lecture appropriés ou une transformation explicite après import. La présentation des données manquantes de pandas aide à distinguer le contenu et sa représentation.

Quand l’import paraît correct mais ne l’est pas

Un seul nom de colonne contenant tout l’en-tête suggère d’abord un mauvais séparateur. Une somme qui concatène du texte invite à examiner le type numérique. Une référence 12 à la place de 0012 signale une interprétation incompatible avec notre contrat. Un code NA devenu absent demande de vérifier les règles d’absence. Ces symptômes pointent vers des causes différentes : n’appliquez pas une réparation unique à tout le tableau.

Regardez aussi les guillemets. Un commentaire peut contenir un point-virgule sans créer une nouvelle colonne s’il est correctement protégé. Une ligne au découpage irrégulier mérite une inspection précise. Écarter silencieusement les lignes problématiques peut faire disparaître des enregistrements importants et fausser vos résultats.

Passer du mini-exemple au vrai fichier

Remplacez StringIO(contenu) par le chemin du fichier et spécifiez son encodage lorsqu’il est connu, par exemple encoding="utf-8-sig" pour une source UTF-8 acceptant une signature initiale. Conservez les assertions pertinentes : colonnes attendues, nombre de lignes plausible, présence de références de contrôle et quelques montants connus. Ajoutez des contrôles adaptés au métier avant de calculer vos indicateurs.

Les exemples de cette page ont été exécutés avec pandas 2.2.3 ; les paramètres ont aussi été vérifiés dans la documentation disponible à la date du guide. Consultez votre version pour des options nouvelles ou un moteur différent. Pour examiner le texte en amont, utilisez le diagnostic CSV local. Pour la suite du nettoyage, définissez une clé de déduplication avant de supprimer des lignes.

PASSEZ À VOTRE ÉCHANTILLON

Les colonnes sont-elles bien lues ?

Comparez quatre séparateurs et repérez les lignes irrégulières. L’analyse reste dans votre navigateur.

Essayer le diagnostic ↗

Vos questions, concrètement

decimal="," suffit-il pour un CSV français ?

Non. Ce paramètre décrit le nombre décimal, pas le séparateur des champs ni les types des colonnes. Le contrat du fichier doit préciser ces décisions séparément.

Pourquoi dtype="string" ne suffit-il pas à garder NA ?

La reconnaissance des marqueurs manquants est distincte du type demandé. Réglez aussi keep_default_na et, si nécessaire, na_values selon les conventions du fichier.

Peut-on laisser pandas deviner le séparateur ?

Certaines options et moteurs proposent une détection. Pour un flux connu, un séparateur explicite avec des assertions est plus facile à contrôler et à reproduire.

REMONTREZ AUX DOCUMENTATIONS

Sources et vérification

Les exemples et explications sont rédigés pour ce guide. Les références ci-dessous documentent les fonctions et comportements mentionnés.

Travaillez sur une copie du fichier et comparez le nombre de lignes avant et après chaque transformation. Les résultats peuvent dépendre de la version de votre logiciel et des options choisies. Notre méthode.

Continuez le diagnostic.

Tous les guides ↗