HOWTO · Pandas
Fusionner deux séries Pandas dans un DataFrame
Ce guide montre comment combiner ou fusionner deux séries Pandas dans un DataFrame à l'aide des méthodes pandas.concat(), pandas.merge(), DataFrame.join().
Sur cette page
Dans pandas, une Series est un tableau étiqueté unidimensionnel, c’est-à-dire en gros une seule colonne de données dotée d’un index. Pour fusionner deux Series ou plus dans un DataFrame, passez-les à pandas.concat() avec axis=1 ; chaque Series devient une colonne portant son nom. Lorsque vous avez besoin d’une autre sémantique, pandas.concat() peut aussi empiler des Series verticalement, pandas.merge() fait correspondre les lignes par index comme une jointure SQL, et DataFrame.join() attache une Series nommée à un DataFrame existant.
Ce tutoriel présente chaque approche à l’aide d’exemples exécutables.
Choisir une méthode selon le résultat souhaité
Les quatre approches produisent des données tabulaires, mais elles répondent à des questions différentes :
pandas.concat([s1, s2], axis=1)place les Series côte à côte afin que chacune devienne une colonne d’un nouveauDataFrame.pandas.concat([s1, s2])avec la valeur par défautaxis=0empile les Series en une seule Series plus longue ; encapsulez le résultat danspd.DataFrame()pour obtenir unDataFrameà une colonne. C’est le remplaçant actuel deSeries.append(), supprimé dans pandas 2.0.pandas.merge(left, right, left_index=True, right_index=True)fait correspondre les lignes par index, ou par valeurs de clé partagées, comme le ferait une jointure SQL.df.join(series)ajoute une Series nommée à unDataFrameque vous possédez déjà, en alignant sur l’index.
Un comportement relie ces méthodes : pandas aligne les données étiquetées par index. Lorsque les Series d’entrée partagent le même index, l’alignement est invisible. Lorsque les index diffèrent, les étiquettes présentes dans une seule entrée produisent des valeurs manquantes (NaN) dans le résultat combiné.
Combiner des Series en colonnes avec pandas.concat()
La fonction pandas.concat() concatène des objets pandas le long d’un axe. Passer axis=1 aligne les objets en colonnes ; chaque nom de Series devient un en-tête de colonne et les lignes sont alignées sur l’index.
Exécutez cet exemple :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
percentage_sale = pd.Series([83, 99, 84, 76], name="Sale")
# merge three pandas series as columns using pandas.concat()
df = pd.concat([products, dollar_price, percentage_sale], axis=1)
print(df)
Sortie :
Products Price Sale
0 Intel Dell Laptops 350 83
1 HP Laptops 300 99
2 Lenavo Laptops 400 84
3 Acer Laptops 250 76
Comme les trois Series partagent l’index entier par défaut, les lignes s’alignent dans l’ordre. Avec axis=0 (la valeur par défaut), le même appel empilerait les valeurs en une seule longue Series au lieu de construire des colonnes.
Empiler des Series verticalement avec pandas.concat()
Les anciennes versions de cette tâche utilisaient Series.append(), un raccourci qui concaténait le long de axis=0. Cette méthode a été dépréciée dans pandas 1.4 puis supprimée dans pandas 2.0 ; l’appeler produit désormais une AttributeError. Le remplaçant est pandas.concat() : passez les Series dans une liste et définissez ignore_index=True pour renuméroter le résultat combiné.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import pandas as pd
technical = pd.Series(["Pandas", "Python", "Scala", "Hadoop"])
non_technical = pd.Series(["SEO", "Graphic design", "Content writing", "Marketing"])
# stack the series and shape the result into a one-column DataFrame
df = pd.DataFrame(
pd.concat([technical, non_technical], ignore_index=True), columns=["Skills"]
)
print(df)
Sortie :
Skills
0 Pandas
1 Python
2 Scala
3 Hadoop
4 SEO
5 Graphic design
6 Content writing
7 Marketing
Ici, pd.concat() renvoie une seule Series de huit valeurs, et pd.DataFrame(..., columns=["Skills"]) la met en forme dans un DataFrame à une colonne. Pour conserver les étiquettes d’index d’origine au lieu de les renuméroter, retirez ignore_index=True.
Faire correspondre des Series par index avec pandas.merge()
pandas.merge() effectue des jointures de style SQL entre des Series nommées ou des objets DataFrame. Comme les valeurs fusionnées deviennent des colonnes, chaque Series a besoin d’un name. Définir left_index=True et right_index=True indique à pandas.merge() de faire correspondre les lignes sur l’index plutôt que sur une colonne clé.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
# match the two series on their index labels
df = pd.merge(products, dollar_price, right_index=True, left_index=True)
print(df)
Sortie :
Products Price
0 Intel Dell Laptops 350
1 HP Laptops 300
2 Lenavo Laptops 400
3 Acer Laptops 250
La jointure par défaut est how="inner", donc les étiquettes d’index présentes dans une seule Series sont exclues du résultat ; passez how="outer" pour conserver toutes les étiquettes et combler les vides avec NaN. Pour faire correspondre les valeurs plutôt que l’index, convertissez les Series en DataFrames et passez un nom de colonne à on.
Joindre une Series à un DataFrame avec DataFrame.join()
DataFrame.join() est l’option la plus pratique lorsque l’un des deux objets est déjà un DataFrame. Convertissez la première Series avec pd.DataFrame(), puis appelez .join() avec la seconde Series ; la Series doit avoir un name, qui devient l’en-tête de la nouvelle colonne.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import pandas as pd
# Create Series by assigning names
products = pd.Series(
["Intel Dell Laptops", "HP Laptops", "Lenavo Laptops", "Acer Laptops"],
name="Products",
)
dollar_price = pd.Series([350, 300, 400, 250], name="Price")
# join the price series to a DataFrame built from products
df = pd.DataFrame(products).join(dollar_price)
print(df)
Sortie :
Products Price
0 Intel Dell Laptops 350
1 HP Laptops 300
2 Lenavo Laptops 400
3 Acer Laptops 250
Comme pandas.merge(), DataFrame.join() aligne sur l’index, mais il utilise par défaut une jointure gauche, de sorte que chaque ligne du DataFrame appelant est conservée.
Pour récapituler le choix de méthode : utilisez pandas.concat() avec axis=1 pour construire un DataFrame à partir de Series indépendantes, pandas.concat() le long de axis=0 pour la tâche d’empilement autrefois assurée par Series.append(), pandas.merge() lorsque les lignes doivent être mises en correspondance par index ou par valeurs de clé, et DataFrame.join() pour attacher une Series nommée à un DataFrame que vous possédez déjà.