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')