Cet article fait suite à la première partie de mon tutoriel sur la librairie Python Pandas. L’idée ici est d’aller plus loin dans la découverte de cette librairie et notamment donner les clés sur les manipulations ensemblistes qu’elle propose. Pour faire simple, vous avez des DataFrame mais vous aller devoir les combiner ensemble afin de travailler vos caractéristiques. Bref vous aller vouloir faire du « SQL like » sur vos données ! Bonne nouvelle, cette librairie vous le permet et ce, de la plus élégante et simple des manières.
Préparons notre jeu de données
Pour ce tuto nous allons créer deux matrices A et B:
import pandas as pd
A = pd.DataFrame({'Col1': [1, 2, 3],
'Col2': [4, 4, 6]},
index=['rowA1', 'rowA2', 'rowA3'])
print("Matrice A\n", A)
B = pd.DataFrame({'Col1': [1, 3],
'Col3': [7, 8],
'Col4': [9, 10]},
index=['rowB1', 'rowB2'])
print("\nMatrice B\n", B)
Les voici :
Matrice A
Col1 Col2
rowA1 1 4
rowA2 2 4
rowA3 3 6
Matrice B
Col1 Col3 Col4
rowB1 1 7 9
rowB2 3 8 10
Décompter les valeurs d’une colonne
La méthode value_counts() apposée à une colonne d’un DataFrame permet de lister les valeurs de cette colonne avec leur nombre d’occurences :
A["Col1"].value_counts()
3 1
2 1
1 1
Name: Col1, dtype: int64
Parcourir les lignes d’un DataFrame
Il peut être parfois utile de parcourir ligne après ligne un DataFrame. pour celà Pandas propose deux itérateurs iterrows() et itertuples (). Ces deux méthodes ont leur subtilité comme itertuples()
qui est supposé être plus rapide que iterrows()
, ou iterrows(
) pourrait ne pas correspondre d’une ligne à l’autre. Bref je vous conseille de bien regarder la documentation Pandas avant de vous lancer dans cette voie.
Pour itérer donc, vous pouvez donc utiliser :
for index, ligne in monDataFrame.iterrows():
print (ligne["Colonne X"])
Filtrer les lignes d’un DataFrame
Le filtrage est une action indispensable dés lors que l’on manipule des jeux de données. Pour celà on dispose de deux méthodes l’une Python et l’autre via Pandas.
B.loc[B['Col3'] == 7]
ou plus simplement
B[B['Col3'] == 7]
Dans les deux cas on filtre le DataFrame sur la colonne ‘Col3’ qui a pour valeur 7.
On peut bien sur combiner plusieurs conditions mais attention de ne pas utiliser les opérateurs booléens and et or dans ce cas mais & et | à la place:
B.loc[(B['Col3'] == 7) | (B['Col3'] > 1)]['Col1']
B.loc[(B['Col3'] == 7) & (B['Col3'] > 1)]['Col1']
Maintenant on peut utiliser la méthode filter des DataFrame Pandas. Elle ne rend pas exactement les mêmes services mais peut s’évérer très pratique pour faire un like par exemple :
A.filter(like='A3', axis=0)
Jointures
Pour ce faire rien de plus simple utilisez la méthode merge et précisez le mode de jointure:
- INNER : jointure stricte
- LEFT : jointure gauche
- RIGHT: jointure droite
- OUTER : full outer
pd.merge(A, B, how='inner', on='Col1')
Union
Pour ce faire rien de plus simple utilisez la méthode concat:
pd.concat([A, B])
Group By
La méthode groupby permet de regrouper des lignes sur un critère et d’effectuer des opérations sur les colonnes. C’est exactement ce que fait le Group By du SQL.
print ("Group By / Count:\n ", A.groupby("Col2")['Col1'].size(), "\n")
print ("Group By / Moyenne:\n ", A.groupby("Col2")['Col1'].mean(), "\n")
Il est possible de préciser plusieurs transformations sur un même groupement :
# Multiple opérations
import numpy as np
A.groupby('Col2').agg({'Col1': np.mean, 'Col2': np.size})
Téléchargez ou consultez le notebook Jupyter avec les exemples ci-dessus sur GitHub.
Pingback: Machine Learning : La mise à l'echelle (Feature Scaling) - Data Corner
Pingback: Accéder à Hive & HDFS via PySpark - Data Corner
Pingback: Python Pandas - Tuto (Partie N°1) - Data Corner