Pandas est la bibliothèque de référence pour la manipulation de données tabulaires en Python. Bien maîtrisé, il remplace des heures de traitement SQL ou Excel par quelques lignes de code.
Chargement et inspection des données
import pandas as pd
import numpy as np
# Charger depuis différentes sources
df_csv = pd.read_csv('orders.csv', parse_dates=['created_at'])
df_excel = pd.read_excel('rapport.xlsx', sheet_name='Ventes')
df_sql = pd.read_sql("SELECT * FROM orders WHERE status='pending'", engine)
df_parquet = pd.read_parquet('data/orders.parquet')
# Inspection rapide
print(df.shape) # (lignes, colonnes)
print(df.dtypes) # types de données
print(df.info()) # résumé complet + valeurs null
print(df.describe()) # statistiques descriptives
print(df.head(10)) # premières lignes
print(df.isnull().sum()) # valeurs manquantes par colonne
Nettoyage de données
# Supprimer les doublons
df = df.drop_duplicates(subset=['order_id'])
# Traiter les valeurs manquantes
df['amount'] = df['amount'].fillna(0)
df['email'] = df['email'].fillna('unknown')
df = df.dropna(subset=['user_id']) # lignes sans user_id → supprimées
# Corriger les types
df['created_at'] = pd.to_datetime(df['created_at'])
df['amount'] = pd.to_numeric(df['amount'], errors='coerce')
# Normaliser les chaînes
df['status'] = df['status'].str.lower().str.strip()
df['email'] = df['email'].str.lower()
# Filtrer les outliers
q1, q3 = df['amount'].quantile([0.25, 0.75])
iqr = q3 - q1
df = df[df['amount'].between(q1 - 1.5*iqr, q3 + 1.5*iqr)]
Sélection et filtrage
# Sélectionner des colonnes
df[['order_id', 'amount', 'status']]
# Filtrer des lignes
df[df['status'] == 'completed']
df[(df['amount'] > 100) & (df['created_at'] > '2026-01-01')]
df[df['status'].isin(['pending', 'processing'])]
# Sélection avancée avec .loc et .iloc
df.loc[df['amount'] > 1000, ['order_id', 'amount', 'user_id']]
df.iloc[0:100, :] # 100 premières lignes, toutes les colonnes
groupby : agréger et résumer
# Chiffre d'affaires par mois et statut
monthly_revenue = (df
.assign(month=df['created_at'].dt.to_period('M'))
.groupby(['month', 'status'])
.agg(
total_revenue=('amount', 'sum'),
order_count=('order_id', 'count'),
avg_order=('amount', 'mean'),
unique_users=('user_id', 'nunique')
)
.reset_index()
.sort_values('month')
)
# Top 10 clients par chiffre d'affaires
top_customers = (df
.groupby('user_id')['amount']
.sum()
.nlargest(10)
.reset_index()
.rename(columns={'amount': 'total_spent'})
)
merge et join : combiner des DataFrames
# Enrichir les commandes avec les infos utilisateurs
orders = pd.read_parquet('orders.parquet')
users = pd.read_parquet('users.parquet')
# Inner join : garder seulement les commandes avec un utilisateur connu
enriched = orders.merge(users, on='user_id', how='inner')
# Left join : garder toutes les commandes (même sans utilisateur)
enriched = orders.merge(users, on='user_id', how='left')
# Merge sur des clés différentes
enriched = orders.merge(users,
left_on='customer_id', right_on='id',
suffixes=('_order', '_user'))
Performance : traiter de gros volumes
# Chunking : lire un CSV de 10GB sans saturer la RAM
chunks = []
for chunk in pd.read_csv('big_file.csv', chunksize=100_000):
# Traiter seulement ce dont on a besoin dans chaque chunk
filtered = chunk[chunk['amount'] > 100][['order_id', 'amount', 'user_id']]
chunks.append(filtered)
result = pd.concat(chunks, ignore_index=True)
# Réduire l'utilisation mémoire avec les bons types
df['status'] = df['status'].astype('category') # économise 90% sur les strings répétées
df['amount'] = df['amount'].astype('float32') # float64 → float32
df['user_id'] = df['user_id'].astype('int32') # int64 → int32
# Sauvegarder en Parquet pour les analyses futures
df.to_parquet('processed.parquet', index=False, compression='snappy')
# Parquet : 5x plus rapide à lire que CSV, 3-10x plus compact
Notre formation Python couvre Pandas et l’analyse de données avec des projets concrets.