Skip to content

Joining Data with pandas

Run the hidden code cell below to import a few of the datasets used in this course.

Note: There are a large number of datasets in the datasets/ folder. Many of these are Pickle files, which you can read using pd.read_pickle(path_to_file). An example is included in the cell below.

# Import pandas
import pandas as pd

# Import some of the course datasets 
actors_movies = pd.read_csv("datasets/actors_movies.csv")
business_owners = pd.read_pickle("datasets/business_owners.p")
casts = pd.read_pickle("datasets/casts.p")

# Preview one of the DataFrames
casts

Joining tables with pandas

New_df = df1.merge(df2, on=col_commune') les colonnes de df1 apparaissent en premier

on peut ajouter dans les parenthèses : suffixes=('_Suffixedf1', '_Suffixedf2') pour distinguer les colonnes df1 et colonnes df2

Pandas prend en charge les relations "one-to-many" (si à une ligne dans df1 correspondent plusieurs lignes dans df2)

argument on sur 2 colonnes on = ['col1', 'col2']

new_df = df1.merge(df2, on = ['col1', 'col2']).\merge(df3, on="col3", suffixes etc)

!!! mettre un backslash pour indiquer que 2 lignes n'en sont qu'une

"Jointure gauche" ajouter how="left" à la fin de la parenthèse .merge (valeur par défaut : "inner", qui correspond à la jointure interne décrite au dessus)

Other joins jointure droite : how="right" et si la colonne sur laquelle on fusionne porte 2 noms distincts dans les 2 base, on ajoute left_on="nom colonne table de gauche", right_on = "nom colonne table de droite" (ça remplace l'argument on = "colonne")

Outer joint : retourne toutes les lignes des 2 tables, qu'il y ait match ou non how="outer"

Auto jointure : on applique simplement la syntaxe merge en mettant deux fois le nom du df. On peut appliquer ensuite les différents how

Merging on indexes : il suffit de mettre le nom d'index dans l'argument ON Si on utilise left on et right on, ajouter left_index = True, right_index = True

Filtering joins Semi join comme un inner join, sauf que seules les colonnes de la table de gauche sont affichées d'abord on fait un inner join puis table1['id'].isin(table2['id']) --> renvoie des booléens ensuite on subset : table1[...]

Anti join : exclut les intersections entre 2 tables. Retourne colonnes de gauche exclusivement --> Left join avec argu indicator=True pour ajouter une colonne __merge indiquant si la ligne vient uniquement du tableau de gauche, ou vient de la fusion des deux ("both") ensuite on fait un loc sur colonne merge = left_only pour isoler les id left only, puis on fait un isin pour que l'id de la table jointe apparaisse dans cette liste

Vertical concatenation pd.concat([df1, df2, df3]) on ajoute ignore_index = True pour ignorer remplacer les 3 index concaténés par un index unique allant de 0 à n-1 on ajoute ignore_index = True, keys=['val1', 'val2', 'val3'] si on veut faire figurer les keys distinguant les 3 fichiers dans l'index (multi index)

si une table a plus de colonnes, sort=True --> trie les noms de colonnes par ordre alphabétiaque join = 'inner' on ne garde que les colonnes communes

Verifying integrity .merge(validate=none)

  • 'one_to_one'
  • 'one_to_many'
  • 'many_to_one'
  • 'many_to_many'

Génère des erreurs si conditions non vérifiées

.concat(verify_intergity=True) (False par défaut) génère erreur si doublon dans les index

merge_ordered : les résultats sont triés. (utile ppour séries temporelles par exemple) outer par défaut (au lieu de inner) pd.merge_ordered(df1, df2) l'ordre se fait sur l'argument ON fill_method='ffill' : forward fill

merge_asof: merge par valeurs approchantes argument direction = 'forward' ou 'backward'

query methode (sélectionner des lignes de données) (syntaxe apparentée à SQL dans la parenthèse)

df.query('col >= float') on peut introduire un and ou un or dans le '' on peut mettre col =="str"

Méthode .melt Wide format (en largeur) : les colonnes portent directement le nom de la variable, une colonne pour chaque valeur de variable : plus pratique pour la lecture Long format (en longueur): les différentes variables sont listées les unes sous les autres dans une seule colonne adjacente à une colonne valeur --> format plus pratique pour l'ordi

la méthode permet de passer de wide à long

df.melt(id_vars=['col1', 'col2']) les colonnes qu'on veut garder en colonnes distinctes

value_vars=['col1', 'col2'] colonne à dépivoter : ça veut dire qu'on ne retient pas les valeurs des colonnes non mentionnées

var_name='str' nom de la colonne des 'noms de variables' value_name='str' nom de la colonne valeur

Add your notes here

# Add your code snippets here