Maîtriser Pandas pour l'analyse de données en Python

Séries et DataFrames

Pandas s'appuie sur NumPy, créant des structures de données flexibles pour la manipulation de tableaux, séries temporelles et matrices étiquetées.

import numpy as np
import pandas as pd

Séries Pandas

Une Series est un tableau unidimensionnel avec des index. Voici un exemple avec des valeurs aléatoires et un index personnalisé :

serie_exemple = pd.Series([4.2, 1.8, np.nan, 5.6, 9.0], index=['alpha', 'beta', 'gamma', 'delta', 'epsilon'])
print(serie_exemple)

DataFrames Pandas

Un DataFrame est une structure tabulaire composée de lignes et de colonnes. Création d'un tableau de données numérique :

donnees = np.arange(12).reshape(4, 3)
df_exemple = pd.DataFrame(donnees, index=['un', 'deux', 'trois', 'quatre'], columns=['X', 'Y', 'Z'])
print(df_exemple)

Opérations courantes avec Pandas

Génération de données

Pour démontrer les fonctionnalités, nous générons un jeu de données aléatoire avec des index de dates :

np.random.seed(42)
plage_dates = pd.date_range('20230401', periods=7)
donnees_aleatoires = np.random.randn(7, 5)
df_principal = pd.DataFrame(donnees_aleatoires, index=plage_dates, columns=['P', 'Q', 'R', 'S', 'T'])
print(df_principal)

Exploration des données

Visualisation des premières et dernières lignes :

print(df_principal.head(3))
print(df_principal.tail(2))

Statistiques descriptives de base :

statistiques = df_principal.describe()
print(statistiques)

Trie et sélection

Trier par une colonne spécifique :

df_trie = df_principal.sort_values(by='R')
print(df_trie)

Sélection par étiquettes avec loc :

selection_etiquettes = df_principal.loc['2023-04-02':'2023-04-04', ['P', 'Q']]
print(selection_etiquettes)

Sélection par position avec iloc :

selection_position = df_principal.iloc[2:5, 1:4]
print(selection_position)

Filtrage par condition booléenne :

masque = df_principal['P'] > 0
df_filtre = df_principal[masque]
print(df_filtre)

Gestion des valeurs manquantes

Créationn d'un DataFrame avec des valeurs manquantes :

df_avec_nan = df_principal.copy()
df_avec_nan.loc[:, 'U'] = pd.Series([10.0, 20.0, np.nan, 40.0, np.nan, 60.0, np.nan], index=plage_dates)
print(df_avec_nan)

Suppression des lignes avec des NaN :

df_nettoye = df_avec_nan.dropna(how='any')
print(df_nettoye)

Remplissage des NaN avec la moyenne de chaque colonne :

df_rempli = df_avec_nan.fillna(df_avec_nan.mean())
print(df_rempli)

Fonctions avancées

Agrégation et application

Calcul de statistiques agrégées :

moyennes_colonnes = df_principal.agg(['mean', 'std'])
print(moyennes_colonnes)

Application d'une fonction personnalisée :

def racine_carree(x):
    return np.sqrt(np.abs(x))

df_transforme = df_principal.apply(racine_carree)
print(df_transforme)

Fusion et concaténation

Concaténation verticale de DataFrames :

df_a = pd.DataFrame({'A': ['a1', 'a2'], 'B': ['b1', 'b2']})
df_b = pd.DataFrame({'A': ['a3', 'a4'], 'B': ['b3', 'b4']})
df_concatene = pd.concat([df_a, df_b], ignore_index=True)
print(df_concatene)

Fusion par une colonne commune :

df_clients = pd.DataFrame({'id_client': [1, 2, 3], 'nom': ['Alice', 'Bob', 'Charlie']})
df_commandes = pd.DataFrame({'id_client': [1, 2, 4], 'montant': [100, 200, 150]})
df_joint = pd.merge(df_clients, df_commandes, on='id_client', how='outer')
print(df_joint)

Regroupement (GroupBy)

Données de démonstration pour le regroupement :

np.random.seed(55)
df_categories = pd.DataFrame({
    'Categorie': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Valeur': np.random.randint(10, 100, size=6)
})
print(df_categories)

Agrégation après regroupement :

resultats_groupe = df_categories.groupby('Categorie').agg(['mean', 'sum'])
print(resultats_groupe)

Techniques supplémentaires

Pivotement et séries temporelles

Création d'une table croisée dynamique :

df_ventes = pd.DataFrame({
    'Region': ['Nord', 'Sud', 'Nord', 'Sud'],
    'Produit': ['A', 'A', 'B', 'B'],
    'Chiffre': [100, 150, 200, 250]
})
table_pivot = pd.pivot_table(df_ventes, values='Chiffre', index='Region', columns='Produit')
print(table_pivot)

Génération de séries temporelles :

plage_horaire = pd.date_range('2023-01-01', periods=5, freq='H')
serie_temporelle = pd.Series(np.random.randn(5), index=plage_horaire)
print(serie_temporelle)

Types catégoriels

Utilisation du type 'category' pour les données discrètes :

df_evaluation = pd.DataFrame({'score': ['excellent', 'bon', 'moyen', 'excellent', 'bon']})
df_evaluation['score'] = df_evaluation['score'].astype('category')
print(df_evaluation['score'].cat.categories)

Import et export de données

Pandas peut lire et écrire divers formats. Exemple avec un fichier CSV :

# Supposons un fichier 'donnees.csv' avec des colonnes 'Date', 'Valeur'
df_importe = pd.read_csv('donnees.csv')
print(df_importe.head())

Pour sauvegarder un DataFrame :

df_principal.to_csv('resultats_export.csv', index=False)

Visualisation de base

Pandas intègre des fonctions de traçage simples basées sur matplotlib :

np.random.seed(77)
df_graph = pd.DataFrame(np.random.rand(6, 3), columns=['a', 'b', 'c'])
df_graph.plot(kind='bar', title='Exemple de graphique')

Étiquettes: Pandas Python DataFrame Series NumPy

Publié le 6 juin à 23h23