Comment remplacer les colonnes d'une dataframe par les colonnes d'une autre dataframe avec pandas ?

Published: 12 septembre 2022

Tags: Python; Pandas; DataFrame;

DMCA.com Protection Status

Exemples de comment remplacer les colonnes d'une dataframe par les colonnes d'une autre dataframe avec pandas ?

Dataframe 1

Créons une première dataframe avec pandas

import pandas as pd
import random
import numpy as np

data = np.arange(40)
data = data.reshape((10,4))

categorical_data = ['M', 'M', 'F', 'F', 'F']

gender_list = [random.choice(categorical_data) for i in range( data.shape[0]  )]

label_list = [random.choice([0,1]) for i in range( data.shape[0]  )]

df = pd.DataFrame(data,columns=['A','B','C','D'])

df['Gender'] = gender_list
df['Label'] = label_list

donne

    A   B   C   D Gender  Label
0   0   1   2   3      M      0
1   4   5   6   7      F      1
2   8   9  10  11      F      1
3  12  13  14  15      F      0
4  16  17  18  19      F      1
5  20  21  22  23      F      1
6  24  25  26  27      M      1
7  28  29  30  31      F      1
8  32  33  34  35      F      0
9  36  37  38  39      M      0

Dataframe 2

Créons maintenant un autre dataframe :

data = np.random.randint(-100,0,size=(10,4))

label_list = [random.choice([0,1]) for i in range( data.shape[0]  )]

df2 = pd.DataFrame(data,columns=['A','B','C','D'])

donne par exemple

    A   B   C   D
0 -41 -53 -38 -14
1 -28 -87 -70 -49
2 -49 -70 -18 -27
3 -26 -90 -74 -24
4 -48 -28 -14 -40
5  -9 -53 -84 -11
6 -62 -26 -35 -90
7  -5 -16 -45 -73
8 -97 -66 -61 -30
9 -14 -51 -79 -60

Remplacement des colonnes de la dataframe 1 par les colonnes de la dataframe 2

Pour remplacer les colonnes de la dataframe 1 par les colonnes de la dataframe 2, une solution est de faire :

columns=['A','B','C','D']

df[columns] = df2[columns]

donne alors

    A   B   C   D Gender  Label
0 -41 -53 -38 -14      M      0
1 -28 -87 -70 -49      F      1
2 -49 -70 -18 -27      F      1
3 -26 -90 -74 -24      F      0
4 -48 -28 -14 -40      F      1
5  -9 -53 -84 -11      F      1
6 -62 -26 -35 -90      M      1
7  -5 -16 -45 -73      F      1
8 -97 -66 -61 -30      F      0
9 -14 -51 -79 -60      M      0

Dataframe 2 avec des index mélangés de manière aléatoire

Autre exemple : mélangeons les index des dataframes :

df2 = df2.sample(frac=1)

donne

    A   B   C   D
1 -28 -87 -70 -49
5  -9 -53 -84 -11
8 -97 -66 -61 -30
7  -5 -16 -45 -73
3 -26 -90 -74 -24
9 -14 -51 -79 -60
4 -48 -28 -14 -40
6 -62 -26 -35 -90
0 -41 -53 -38 -14
2 -49 -70 -18 -27

et

df[columns] = df2[columns]

donne encore

    A   B   C   D Gender  Label
0 -41 -53 -38 -14      M      0
1 -28 -87 -70 -49      F      1
2 -49 -70 -18 -27      F      1
3 -26 -90 -74 -24      F      0
4 -48 -28 -14 -40      F      1
5  -9 -53 -84 -11      F      1
6 -62 -26 -35 -90      M      1
7  -5 -16 -45 -73      F      1
8 -97 -66 -61 -30      F      0
9 -14 -51 -79 -60      M      0

Dataframe 2 avec moins de lignes que dataframe 1

Maintenant, si la dataframe 2 a moins de lignes que la dataframes 1

df2 = df2.sample(frac=0.2)

donne par exemple

    A   B   C   D
3 -26 -90 -74 -24
0 -41 -53 -38 -14

et

print(df2.index)

donne

Int64Index([3, 0], dtype='int64')

Une solution est de faire :

df.loc[df2.index,columns] = df2[columns]

donne

    A   B   C   D Gender  Label
0 -41 -53 -38 -14      M      0
1   4   5   6   7      F      1
2   8   9  10  11      F      1
3 -26 -90 -74 -24      F      0
4  16  17  18  19      F      1
5  20  21  22  23      F      1
6  24  25  26  27      M      1
7  28  29  30  31      F      1
8  32  33  34  35      F      0
9  36  37  38  39      M      0

Dataframe 2 avec un nom de colonne différent

Un autre exemple avec dataframe 2 avec un nom de colonne différent :

data = np.random.randint(-100,0,size=(10,4))

label_list = [random.choice([0,1]) for i in range( data.shape[0]  )]

df2 = pd.DataFrame(data,columns=['E','F','G','H'])

df[columns] = df2[['E','F','G','H']]

donne encore

    A   B    C    D Gender  Label
0 -65 -24  -93  -51      M      0
1 -21 -20 -100  -81      F      1
2 -44 -70  -95  -48      F      1
3 -46 -91  -82  -32      F      0
4 -42 -66   -6  -54      F      1
5 -71 -18   -3 -100      F      1
6 -10 -17  -18  -52      M      1
7 -11 -46  -56  -98      F      1
8 -65 -40  -11  -56      F      0
9 -16 -55   -5  -48      M      0

Références

pandas replace columns by another dataframe
- Replacing Columns from one dataframe with columns from another dataframe in pandas
- Python Pandas update a dataframe value from another dataframe
- Replace column values based on another dataframe python pandas - better way?