Skip to article frontmatterSkip to article content
import pandas as pd
import numpy as np

en hauteur pd.concat()

# 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
Loading...
df2
Loading...
# 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
Loading...
# nous indexons les dataframes par la colonne 'name'
pd.concat([df1.set_index('name'), df2.set_index('name')])
Loading...

en largeur pd.merge()

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
Loading...
df2
Loading...
# sans rien préciser, on JOIN sur la colonne commune 'name'

df1.merge(df2)
Loading...
# on peut aussi l'écrire comme ceci

pd.merge(df1, df2)
Loading...
# 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
Loading...
df2
Loading...
# 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')
Loading...
# ou encore

pd.merge(df1, df2, left_index=True, right_on='name')
Loading...

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:

(il y a aussi cross, mais c’est plus particulier comme usage..)

concat() vs merge()