Divida una sola columna en varias columnas en Pandas DataFrame Column

Luqman Khan 14 abril 2022
Divida una sola columna en varias columnas en Pandas DataFrame Column

Pandas tiene un método bien conocido para dividir una columna de cadena o columna de texto por guiones, espacios en blanco y columna de retorno (“Serie”) de listas; si hablamos de pandas, el término Series se llama la columna Dataframe.

Podemos usar la función pandas Series.str.split() para dividir cadenas en varias columnas alrededor de un separador o delimitador determinado. Es similar al método split() de la cadena Python, pero se aplica a toda la columna Dataframe. Tenemos la forma más sencilla de separar la columna debajo de la siguiente.

Este método separa la cadena Series del índice inicial.

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

Intentemos entender el funcionamiento de este método.

# 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)

Hemos creado un Dataframe df con tres columnas, Email, Número y Ubicación. Tenga en cuenta que las cadenas de la columna Correo electrónico tienen un patrón específico. Sin embargo, si observa más de cerca, esta columna se puede dividir en dos columnas. Resolveremos muy bien el problema requerido.

Producción :

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

Usaremos la función Series.str.split() para separar la columna Number y pasar el - en el método split(). Asegúrese de pasar True a la palabra clave “expandir”.

Ejemplo 1:

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

Este ejemplo dividirá todos los valores de la serie (Número) por -.

Producción :

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

Si usamos solo el parámetro de expansión Series.str.split(expand=True), esto permitirá dividir los espacios en blanco pero no es posible separarlos con - y , o cualquier expresión regular si existe en la cadena, debe pasar parámetro pat.

Cambiemos el nombre de estas columnas divididas.

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

Creamos dos nuevas series “Código de marcación” y “Número de celular” y asignamos los valores usando la serie “Número”.

Producción :

                      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  

Ejemplo 2:

En este ejemplo, vamos a dividir la serie Ubicación por ,.

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

Divida la serie Ubicación y almacene sus valores en series individuales Ciudad y Estado.

Producción :

                      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 

Veamos el último ejemplo. Separaremos el nombre completo en la serie Email.

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

Producción :

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

Ahora separamos nombres y apellidos por ..

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

Producción :

                      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 

El parámetro n=-1 no funcionará si se pasa expand=True en el método .split().

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

Producción :

        0           1
0  George  Washington
1   Hamza       Azeez
2   Harry      Walker

El código de ejemplo completo está debajo.

# 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)

Producción :

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 

Artículo relacionado - Pandas DataFrame