Quand j'explore/analyse des données, la première chose que je fais est toujours :
In [1]:
import pandas as pd
Pour information/rappel,
In [2]:
pd.__version__
Out[2]:
Pour lire un fichier CSV, nous utilisons la bien nommée fonction...
In [3]:
pd.read_csv('data/enfants.csv')
Out[3]:
Ah, oui, j'ai pensé que votre feuille Excel serait exportée avec «;» comme caractère séparateur, car certains champs sont plus susceptibles de contenir des virgules...
In [4]:
pd.read_csv('data/enfants.csv', sep=';')
Out[4]:
Bien. On dirait que les valeurs inconnues/manquantes sont indiquées par «99». Alors spécifions cela dans les options de la merveilleuse fonction read_csv()
.
In [5]:
pd.read_csv('data/enfants.csv', sep=';', na_values=99)
Out[5]:
Nous allons donner un nom à ce «data frame» (structure de données très pratique), ce sera enfants
.
In [6]:
enfants = pd.read_csv('data/enfants.csv', sep=';', na_values='99')
Nous pouvons accéder aux données de garde avec la syntaxe (intuitive) suivante :
In [7]:
enfants['garde']
Out[7]:
ou bien enfants.loc[:, 'garde']
.
Remarquons que nous avons deux entrées pour Toto Le Magnifique. Si nous ne voulons conserver qu'une entrée (ligne) par enfant, nous pouvons utiliser la méthode drop_duplicates()
.
In [8]:
enfants.drop_duplicates(subset=['prénom', 'nom'])
Out[8]:
Par défaut, c'est la première entrée qui est conservée (voir la documentation). Nous perdons alors l'information contenue dans les autres entrées. Nous voudrions plutôt les grouper.
In [9]:
enfants.groupby(by=['prénom', 'nom'])['garde'].sum()
Out[9]:
Par défaut, sum()
concatène. Pour une meilleure lisibilité, nous voulons peut-être appliquer une fonction faite maison.
In [10]:
enfants.groupby(by=['prénom', 'nom'])['garde'].apply(lambda x: '%s' % ', '.join(x.astype(str)))
Out[10]:
Ecrivons une fonction (à appliquer au data frame).
In [11]:
def groupe_garde(x):
return pd.Series(dict(age = x['âge'].mean(), garde_complete = '%s' % ', '.join(x['garde'].astype(str))))
In [12]:
enfants.groupby(by=['prénom', 'nom']).apply(groupe_garde)
Out[12]:
In [13]:
enfants.groupby(by=['prénom', 'nom']).apply(groupe_garde).to_csv('results/enfants_cleanup.csv', sep=';', na_rep='nan')
Et si nous voulions continuer...
In [14]:
pd.read_csv('results/enfants_cleanup.csv', sep=';', na_values='nan')
Out[14]: