Guide complet sur la lecture et l'écriture de données avec Pandas

La bibliothèque pandas est l'outil de référence en Python pour manipuler des données structurées. L'une de ses plus grandes forces réside dans sa capacité à interagir avec une multitude de formats de fichiers et de sources de données. Ce guide explore les fonctions essentielles pour importer et exporter vos jeux de données.

Tableau récapitulatif des fonctions I/O

Format de données Lecture (Import) Écriture (Export)
CSV / Texte read_csv / read_table to_csv
Presse-papiers read_clipboard to_clipboard
Excel read_excel to_excel
SQL read_sql to_sql
JSON read_json to_json
Pickle (Sérilisation) read_pickle to_pickle
HDF5 read_hdf to_hdf
HTML read_html to_html

Manipulation des fichiers CSV et Textes

Les fichiers délimités par des virgules (CSV) ou d'autres caractères (tabulations, espaces) sont les sources les plus courantes en analyse de données. Voici comment les gérer avec précision.

import pandas as pd
import numpy as np

# Chargement standard d'un fichier CSV
df_basique = pd.read_csv('data/source_01.csv')

# Utilisation de read_table avec un séparateur spécifique
df_sep = pd.read_table('data/source_01.csv', sep=',')

# Lecture d'un fichier sans entête avec attribution de noms de colonnes
colonnes = ['id', 'valeur_a', 'valeur_b', 'categorie', 'label']
df_sans_entete = pd.read_csv('data/source_02.csv', names=colonnes)

# Création d'un index hiérarchique (MultiIndex) lors de la lecture
df_index = pd.read_csv('data/source_03.csv', index_col=['categorie', 'label'])

# Utilisation d'expressions régulières pour gérer les espaces variables
df_regex = pd.read_table('data/data_txt.txt', sep='\s+')

# Ignorer des lignes spécifiques (utile pour les métadonnées en début de fichier)
df_filtre = pd.read_table('data/data_brute.txt', sep=',', skiprows=[0, 2, 5])

Traitement de fichiers volumineux par blocs

Pour les jeux de données trop lourds pour la mémoire vive, pandas permet de segmenter la lecture via le paramètre chunksize. On peut ainsi itérer sur le fichier et effectuer des calculs partiels.

# Lecture par blocs de 500 lignes
itérateur_blocs = pd.read_csv('data/gros_fichier.csv', chunksize=500)

totaux = pd.Series(dtype='float64')
for i, bloc in enumerate(itérateur_blocs):
    # Calcul de la somme d'une colonne spécifique par bloc
    totaux.at[f"Bloc_{i}"] = bloc['valeur_numérique'].sum()

print(totaux)

Exportation de données

L'exportation vers un format CSV peut être personnalisée pour enclure ou non les index, gérer les valeurs manqunates ou modifier le séparateur.

# Export standard
df_basique.to_csv('sortie/resultat.csv')

# Export sans index ni entête, et remplacement des NaN par un texte spécifique
df_basique.to_csv('sortie/resultat_propre.csv', index=False, header=False, na_rep='N/A')

Interactions avec le format HTML

Pandas peut transformer un DataFrame en table HTML ou extraire des données directement depuis une page web ou un fichier local.

# Conversion d'un DataFrame en structure HTML
df_demo = pd.DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C'])
code_html = df_demo.to_html()

# Extraction de tables depuis une URL (nécessite lxml ou beautifulsoup4)
tables_web = pd.read_html('http://exemple-statistiques.com/donnees')
df_site = tables_web[0]

Utilisation du format XML avec lxml

Bien que pandas dispose désormais d'un read_xml, l'utilisation de la bibliothèque lxml.objectify reste une méthode robuste pour parser des structurse complexes.

from lxml import objectify

# Parsing d'un fichier XML
flux_xml = objectify.parse('data/inventaire.xml')
racine = flux_xml.getroot()

# Accès aux éléments
print(racine.Article[0].Titre)

# Extraction de données pour conversion ultérieure en DataFrame
data_extraction = []
for item in racine.Article:
    data_extraction.append({
        'Titre': item.Titre.text,
        'Prix': item.Prix.text
    })
df_xml = pd.DataFrame(data_extraction)

Formats binaires : HDF5 et Pickle

Pour la performance et le stockage massif, les formats binaires sont préférables au texte brut.

# Stockage HDF5 (idéal pour de gros volumes)
from pandas import HDFStore

store = HDFStore('data/archive.h5')
store['dataset_1'] = df_demo
store.close()

# Sérialisation avec Pickle (conserve les types Python)
df_demo.to_pickle('data/sauvegarde_etat.pkl')
df_restaure = pd.read_pickle('data/sauvegarde_etat.pkl')

Connexion aux bases de données SQL

Grâce à SQLAlchemy, pandas communique avec la plupart des moteurs de bases de données (PostgreSQL, MySQL, SQLite, Oracle, SQL Server).

from sqlalchemy import create_engine

# Connexion à une base de données SQLite locale
moteur_sql = create_engine('sqlite:///data/ma_base.db')

# Écriture d'un DataFrame dans une table SQL
df_demo.to_sql('table_donnees', moteur_sql, if_exists='replace')

# Lecture d'une requête SQL ou d'une table
df_sql = pd.read_sql('SELECT * FROM table_donnees WHERE A > 0', moteur_sql)

Le format de l'URL de connexion SQLAlchemy suit généralement cette structure : dialecte+pilote://utilisateur:mot_de_passe@hôte:port/base_de_données.

Étiquettes: Pandas Python csv SQLAlchemy HDF5

Publié le 19 octobre à 18h45