import pandas as pd
import numpy as np
en hauteur pd.concat()
¶
pour l’accumulation de données (en hauteur donc), préférez la fonction pandas
suivante
- la fonction
pd.concat([df1, df2, ..])
qui a vocation à accumuler des données en hauteur
# exemple 1
# les deux dataframes ont les mêmes colonnes
# (ici on crée les dataframe à partir d'un dict décrivant les colonnes)
df1 = pd.DataFrame(
data={
'name': ['Bob', 'Lisa', 'Sue'],
'group': ['Accounting', 'Engineering', 'HR']})
df2 = pd.DataFrame(
data={
'name': ['John', 'Mary', 'Andrew'],
'group': ['HR', 'Accounting', 'Engineering',]})
df1
df2
# nous ne gardons pas les index de chaque sous-dataframe
pd.concat([df1, df2], ignore_index=True)
# pd.concat([df1, df2], axis=0) # by default concat rows
# nous indexons les dataframes par la colonne 'name'
pd.concat([df1.set_index('name'), df2.set_index('name')])
en largeur pd.merge()
¶
pour la réconciliation de données, voyez cette fois
la fonction
pd.merge(left, right)
ou sous forme de méthodeleft.merge(right)
et la méthode
left.join(right)
- en fait une version simplifiée deleft.merge(...)
grâce à ces outils, il est possible d’aligner des dataframes sur les valeurs de une ou plusieurs colonnes
alignements¶
dans les deux cas, pandas
va aligner les données
par exemple on peut concaténer deux tables qui ont les mêmes colonnes, même si elles sont dans le désordre
l’usage typique de merge()
/join()
est l’équivalent d’un JOIN en SQL (pour ceux à qui ça dit quelque chose)
sans indication, merge()
calcule les colonnes communes et se sert de ça pour aligner les lignes
# exemple 1
# les deux dataframes ont exactement une colonne en commun: 'name'
df1 = pd.DataFrame(
data={
'name': ['Bob', 'Lisa', 'Sue'],
'group': ['Accounting', 'Engineering', 'HR']}) # une seule colonne
df2 = pd.DataFrame(
data={
'name': ['Lisa', 'Bob', 'Sue'],
'hire_date': [2004, 2008, 2014]})
df1
df2
# sans rien préciser, on JOIN sur la colonne commune 'name'
df1.merge(df2)
# on peut aussi l'écrire comme ceci
pd.merge(df1, df2)
# exemple 2
# cette fois il faut aligner l'index de gauche
# avec la colonne 'name' à droite
df1 = pd.DataFrame(
index = ['Bob', 'Lisa', 'Sue'], # l'index
data={'group': ['Accounting', 'Engineering', 'HR']}) # une seule colonne
df2 = pd.DataFrame(
data = {'name': ['Lisa', 'Bob', 'Sue'],
'hire_date': [2004, 2008, 2014]})
df1
df2
# du coup ici sans préciser de paramètres, ça ne fonctionnerait pas
# il faut être explicite
df1.merge(df2, left_index=True, right_on='name')
# ou encore
pd.merge(df1, df2, left_index=True, right_on='name')
optionnel: plusieurs stratégies pour le merge/join¶
comme en SQL, on a à notre disposition plusieurs stratégies pour le merge
(ou join
, donc)
le paramètre how
peut prendre les valeurs suivantes:
left
: on garde les clés qui sont dans la première dataframeright
: on garde les clés qui sont dans la seconde dataframeinner
: on garde les clés communesouter
: on garde l’union des clés
(il y a aussi cross
, mais c’est plus particulier comme usage..)
concat() vs merge()¶
les deux fonctionnalités sont assez similaires sauf que
merge
est une opération binaire, alors queconcat
est n-aire
ce qui explique d’ailleurs la différence de signatures:concat([d1, d2])
vsmerge(d1, d2)
seule
concat()
supporte un paramètreaxis=