Skip to content

CSV et Pandas

Impossible de parler de données en tables sans évoquer ces deux modules csv et pandas. Néanmoins, il n'est pas raisonnable d'envisager un cours complet sur ces modules dans le cadre de ce MOOC.

Nous ne faisons qu'une brève présentation et invitons le lecteur curieux à approfondir, soit par la documentation officielle (pour le module csv) soit par un des nombreux cours ou tutoriels existants pour le module pandas.

Module csv

Le module csv offre, entre autres, deux fonctions facilitant la lecture des données en tables.

Sans descripteur

Le fichier langages.csv contient quelques langages de programmation ainsi que leurs années de naissance. Ce fichier ne contient pas de descripteur.

La fonction reader du module csv va nous permettre de créer un tableau où chaque enregistrement sera aussi un tableau :

import csv

def lecture(fichier, delimiter=';', encoding='utf-8'):
    with open(fichier, 'r', encoding=encoding, newline='') as csvfile:
        return list(csv.reader(csvfile, delimiter=delimiter))
>>> LANGAGES = lecture('langages.csv')
>>> LANGAGES[:3]
[['fortran', '1954'], ['lisp', '1959'], ['cobol', '1960']]

Avec descripteur

La fonction DictReader effectue le même travail de lecture des données mais en tenant compte du fait que la première ligne correspond aux descripteurs. Les enregistrements sont alors stockés sous forme de dictionnaires :

def lecture(fichier, delimiter=';', encoding='utf-8'):
    with open(fichier, 'r', encoding=encoding, newline='') as csvfile:
        return list(csv.DictReader(csvfile, delimiter=delimiter))
>>> L_PAYS[0]
{'code': 'AD',
 'nom': 'Andorra',
 'capitale': 'Andorra la Vella',
 'aire': '468',
 'pop': '77006',
 'continent': 'EU'}

Remarque : le paramètre newline de la fonction open de Python permet de gérer correctement les différents retours à la ligne.

Écrire des données

Le module sert aussi à écrire dans un fichier les données stockées dans des dictionnaires. Pour cela, il faut mettre en oeuvre la fonction DictWriter pour créer un objet descripteur. Les méthodes writeheader et writerow permettent alors d'écrire les lignes du fichier. Voici l'exemple de la documentation Python du module :

with open('names.csv', 'w', newline='') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})
    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})

Le paramètre des descripteurs n'est pas optionnel car l'ordre doit être spécifié.

Module pandas

Contrairement au module csv, le module pandas n'est pas installé par défaut avec une installation standard de Python. Pour une installation du module, le mieux est de se référer au site officiel pandas.pydata.org.

Mais en général un simple :

pip install pandas

fera l'affaire. Pour les environnement basés sur conda consulter la documentation.

Pandas est un outil complet de manipulation de données, non un simple lecteur de fichiers csv. Nous n'entrerons pas dans le détail mais présentons ici la philosophie du module concernant les données en tables.

L'objet qui modélise une donnée pandas est le DataFrame. Voici comment, grâce à la fonction read_csv du module pandas, nous pouvons créer un DataFrame des données en tables :

import pandas

def lecture(fichier, delimiter=';', encoding='utf-8'):
    with open(fichier, 'r', encoding=encoding, newline='') as csvfile:
        return pandas.read_csv(csvfile, delimiter=delimiter)
>>> PAYS = lecture('countries.csv')
>>> type(PANDAS)
pandas.core.frame.DataFrame

>>> PANDAS
sortie

code nom capitale aire pop continent
0 AD Andorra Andorra la Vella 468.0 77006 EU
1 AE United Arab Emirates Abu Dhabi 82880.0 9630959 AS
... ... ... ... ... ... ...
250 ZM Zambia Lusaka 752614.0 17351822 AF
251 ZW Zimbabwe Harare 390580.0 14439018 AF

À partir d'un DataFrame, on peut extraire des Series (les colonnes) :

>>> PAYS.nom   # ou PAYS['nom']

sortie

0 Andorra
1 United Arab Emirates
... ...
251 Zimbabwe

Name: nom, Length: 252, dtype: object

>>> type(PAYS.nom)
pandas.core.series.Series

La méthode loc permet de récupérer des données parmi ce tableau : la première valeur de la méthode correspond à un critère sur les lignes, la deuxième à un critère sur les colonnes. On peut utiliser la version iloc lorsqu'on fournit un indice pour la ligne :

Les informations concernant le premier enregistrement

>>> andorra = PAYS.iloc[0]
>>> andorra.nom
'Andorra'
>>> andorra
sortie

code AD
nom Andorra
capitale Andorra la Vella
aire 468.0
pop 77006
continent EU

Name: 0, dtype: object

Recherche multiple

Voici sur un exemple ce que donne une requête sur plusieurs critères. Nous recherchons les pays d'Europe de moins de 10000km2 :

>>> ppe = PAYS.loc[(PAYS.aire < 10000.) & (PAYS.continent == 'EU'),:]
>>> ppe

sortie

code nom capitale aire pop continent
0 AD Andorra Andorra la Vella 468.0 77006 EU
15 AX Åland Mariehamn 1580.0 26711 EU
56 CY Cyprus Nicosia 9250.0 1189265 EU
... ... ... ... ... ... ...
205 SM San Marino San Marino 61.2 33785 EU
237 VA Vatican City Vatican City 0.4 921 EU

Une dernière requête : nous voulons obtenir le nom, la capitale et l'aire des pays extrêmes c'est-à-dire soit tout petitS (moins de 1 000km2) soit très grands (plus de 5 000 000) et triés par ordre croissant sur l'aire (qui doit aussi être non nulle) :

>>> extremes = PAYS.loc[(PAYS.aire > 0.0) & (PAYS.aire < 1000.) | (PAYS.aire > 5000000.),['nom', 'capitale', 'aire']].sort_values(by='aire')

Nous ne pousserons pas plus loin la présentation de ce module d'une très grande richesse et invitons le lecteur à approfondir en suivant un cours spécifique.