Diviser une seule colonne en plusieurs colonnes dans la colonne Pandas DataFrame

Luqman Khan 14 avril 2022
Diviser une seule colonne en plusieurs colonnes dans la colonne Pandas DataFrame

Pandas a une méthode bien connue pour diviser une colonne de chaîne ou une colonne de texte par des tirets, des espaces et une colonne de retour (Series) de listes ; si on parle de pandas, le terme Series s’appelle la colonne Dataframe.

Nous pouvons utiliser la fonction pandas Series.str.split() pour diviser les chaînes en plusieurs colonnes autour d’un séparateur ou d’un délimiteur donné. Elle est similaire à la méthode Python string split() mais s’applique à l’ensemble de la colonne Dataframe. Nous avons le moyen le plus simple de séparer la colonne ci-dessous de la suivante.

Cette méthode sépare la chaîne Series de l’index initial.

Series.str.split(pat=None, n=-1, expand=False)

Essayons de comprendre le fonctionnement de cette méthode

# import Pandas as pd
import pandas as pd

# innitilize Dataframe
df = pd.DataFrame(
    {
        "Email": [
            "Alex.jhon@gmail.com",
            "Hamza.Azeez@gmail.com",
            "Harry.barton@hotmail.com",
        ],
        "Number": ["+44-3844556210", "+44-2245551219", "+44-1049956215"],
        "Location": ["Alameda,California", "Sanford,Florida", "Columbus,Georgia"],
    }
)
print("Dataframe series:\n", df)

Nous avons créé un Dataframe df avec trois colonnes, Email, Number et Location. Notez que les chaînes de la colonne E-mail ont un modèle spécifique. Cependant, si vous regardez de plus près, cette colonne peut être divisée en deux colonnes. Nous résoudrons très bien le problème requis.

Production :

Dataframe series :
                       Email          Number            Location
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia

Nous allons utiliser la fonction Series.str.split() pour séparer la colonne Number et passer le - dans la méthode split(). Assurez-vous de passer True au mot-clé expand.

Exemple 1:

print(
    "\n\nSplit 'Number' column by '-' into two individual columns :\n",
    df.Number.str.split(pat="-", expand=True),
)

Cet exemple divisera chaque valeur de la série (Nombre) par -.

Production :

Split 'Number' column into two individual columns :
      0           1
0  +44  3844556210
1  +44  2245551219
2  +44  1049956215

Si nous n’utilisons que le paramètre d’expansion Series.str.split(expand=True), cela permettra de diviser les espaces mais pas possible de séparer avec - et - ou toute expression régulière si elle existe dans la chaîne, vous devez passer paramètre pat.

Renommez ces colonnes fractionnées.

df[["Dialling Code", "Cell-Number"]] = df.Number.str.split("-", expand=True)
print(df)

Nous avons créé deux nouvelles séries Code de numérotation et Cell-Number et attribué les valeurs à l’aide de la série Number.

Production :

                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number  
0  3844556210  
1  2245551219  
2  1049956215  

Exemple 2 :

Dans cet exemple, nous allons diviser la série Location par ,.

df[["City", "State"]] = df.Location.str.split(",", expand=True)
print(df)

Divisez la série Location et stockez ses valeurs dans des séries individuelles City et State.

Production :

                      Email          Number            Location      City  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California   Alameda   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida   Sanford   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia  Columbus   

        State  
0  California  
1     Florida  
2     Georgia 

Voyons le dernier exemple. Nous séparerons le nom complet dans la série Email.

full_name = df.Email.str.split(pat="@", expand=True)
print(full_name)

Production :

              0            1
0     Alex.jhon    gmail.com
1   Hamza.Azeez    gmail.com
2  Harry.barton  hotmail.com

Maintenant, nous séparons les prénoms et noms de famille par ..

df[["First Name", "Last Name"]] = full_name[0].str.split(".", expand=True)
print(df)

Production :

                      Email          Number            Location First Name  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California       Alex   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida      Hamza   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia      Harry   

  Last Name  
0      jhon  
1     Azeez  
2    barton 

Le paramètre n=-1 ne fonctionnera pas si expand=True est passé dans la méthode .split().

print(df["Email"].str.split("@", n=-1, expand=True))

Production :

        0           1
0  George  Washington
1   Hamza       Azeez
2   Harry      Walker

L’ensemble du code d’exemple est ci-dessous.

# import Pandas as pd
import pandas as pd

# create a new Dataframe
df = pd.DataFrame(
    {
        "Email": [
            "Alex.jhon@gmail.com",
            "Hamza.Azeez@gmail.com",
            "Harry.barton@hotmail.com",
        ],
        "Number": ["+44-3844556210", "+44-2245551219", "+44-1049956215"],
        "Location": ["Alameda,California", "Sanford,Florida", "Columbus,Georgia"],
    }
)

print("Dataframe series :\n", df)

print(
    "\n\nSplit 'Number' column by '-' into two individual columns :\n",
    df.Number.str.split(pat="-", expand=True),
)

df[["Dialling Code", "Cell-Number"]] = df.Number.str.split("-", expand=True)
print(df)

df[["City", "State"]] = df.Location.str.split(",", expand=True)
print(df)

full_name = df.Email.str.split(pat="@", expand=True)
print(full_name)

df[["First Name", "Last Name"]] = full_name[0].str.split(".", expand=True)
print(df)

Production :

Dataframe series :
                       Email          Number            Location
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia


Split 'Number' column by '-' into two individual columns :
      0           1
0  +44  3844556210
1  +44  2245551219
2  +44  1049956215
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number  
0  3844556210  
1  2245551219  
2  1049956215  
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number      City       State  
0  3844556210   Alameda  California  
1  2245551219   Sanford     Florida  
2  1049956215  Columbus     Georgia  
              0            1
0     Alex.jhon    gmail.com
1   Hamza.Azeez    gmail.com
2  Harry.barton  hotmail.com
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number      City       State First Name Last Name  
0  3844556210   Alameda  California       Alex      jhon  
1  2245551219   Sanford     Florida      Hamza     Azeez  
2  1049956215  Columbus     Georgia      Harry    barton 

Article connexe - Pandas DataFrame