Comment diviser une colonne avec des noms en colonnes avec des prénoms et des noms de famille avec pandas ?

Published: 11 septembre 2022

Tags: Python; Pandas; DataFrame;

DMCA.com Protection Status

Exemple de comment diviser une colonne avec des noms en colonnes avec des prénoms et des noms de famille avec pandas

Créer une dataframe avec pandas

Commençons par créer une dataframe avec des pandas :

import pandas as pd
import numpy as np

data = {'Full_Name':['April Reiter','Emory Miller','David Ballin','Alice Trotter','Virginia Alicia Rios']}

df = pd.DataFrame(data=data)

print(df)

donne

       Full_Name
0   April Reiter
1   Emory Miller
2   David Ballin
3  Alice Trotter
4  Virginia Rios

Diviser le nom complet en 2 colonnes

Pour diviser la colonne appelée Full_Name, une solution consiste à utiliser pandas.Series.str.split:

df['Full_Name'].str.split(expand=True)

          0        1
0     April   Reiter
1     Emory   Miller
2     David   Ballin
3     Alice  Trotter
4  Virginia     Rios

Une autre solution avec pandas.Series.str.extract and a regular expression

df['Full_Name'].str.extract(r'(\w+) (\w+)', expand=True)

donne

          0        1
0     April   Reiter
1     Emory   Miller
2     David   Ballin
3     Alice  Trotter
4  Virginia     Rios

Pour donner directement un nom aux nouvelles colonnes il suffit de faire :

df['Full_Name'].str.extract(r'(?P<First_Name>\w+) (?P<Last_Name>\w+)', expand=True)

donne alors

  First_Name Last_Name
0      April    Reiter
1      Emory    Miller
2      David    Ballin
3      Alice   Trotter
4   Virginia      Rios

Un autre exemple

Voyons un exemple plus compliqué : supposons que l'un des noms complets soit un deuxième prénom ici "Virginia Alicia Rios" au lieu de "Virginia Rios" auparavant :
import pandas as pd
import numpy as np

data = {'Full_Name':['April Reiter','Emory Miller','David Ballin','Alice Trotter','Virginia Alicia Rios']}

df = pd.DataFrame(data=data)

print(df)

donne

              Full_Name
0          April Reiter
1          Emory Miller
2          David Ballin
3         Alice Trotter
4  Virginia Alicia Rios

alors

df['Full_Name'].str.split(expand=True)

renverra trois colonnes :

          0        1     2
0     April   Reiter  None
1     Emory   Miller  None
2     David   Ballin  None
3     Alice  Trotter  None
4  Virginia   Alicia  Rios

Pour obtenir seulement deux colonnes, une solution consiste à utiliser extract

df['Full_Name'].str.extract(r'(?P<First_Name>\w+) (?P<Last_Name>\w+)', expand=True)

donne

  First_Name Last_Name
0      April    Reiter
1      Emory    Miller
2      David    Ballin
3      Alice   Trotter
4   Virginia    Alicia

Cependant on peut voir que le nom de famille de Virginia est Alicia ici pas Rios. Pour résoudre ce problème, une solution consiste à ajouter un $ :

print( df['Full_Name'].str.extract(r'(?P<First_Name>\w+) (?P<Last_Name>\w+)$', expand=True) )

donne

  First_Name Last_Name
0      April    Reiter
1      Emory    Miller
2      David    Ballin
3      Alice   Trotter
4     Alicia      Rios

Références