Al trabajar con conjuntos de datos en los que algunas características son cadenas de texto es habitual encontrarse con registros que no están en el formato deseado. Tanto valores que estas juntos como separados. Para solucionar el primer problema es necesario separar el texto de una característica en varias, lo que se explicó en una entrada anterior. Por otro lado, la solución del segundo problema requiere combinar dos columnas de texto en otra. Algo que en los objetos DataFrame de Pandas se puede conseguir mediante el uso de la propiedad .str.cat()
.
Conjunto de datos de ejemplo
Un caso típico en el que puede ser necesario combinar dos columnas de texto en Pandas es cuando se tiene separados el nombre y los apellidos y se desea disponer del nombre completo. Por ejemplo, en un conjunto de datos como el siguiente.
import pandas as pd users = pd.DataFrame({'first_name': ['Montgomery', 'Dagmar', 'Reeba', 'Shalom', 'Broddy', 'Aurelia'], 'last_name': ['Humes', 'Elstow', 'Wattisham', 'Alen', 'Keningham', 'Brechin'], 'age': [27, 41, 29, 29, 21, 33], 'gender': ['Male', 'Female', 'Female', 'Male', 'Male', 'Female']}) users
first_name last_name age gender 0 Montgomery Humes 27 Male 1 Dagmar Elstow 41 Female 2 Reeba Wattisham 29 Female 3 Shalom Alen 29 Male 4 Broddy Keningham 21 Male 5 Aurelia Brechin 33 Female
Concatenar dos columnas de texto en Pandas con .str.cat()
Una opción para crear una nueva columna en el conjunto de datos users
con el nombre completo es recurrir al método .str.cat()
. Un método que existe en las series de Pandas y tiene como primer parámetro la serie que se desea concatenar. Así, para obtener el nombre completo solamente hay que escribir.
users['full_name'] = users.first_name.str.cat(users.last_name) users
first_name last_name age gender full_name 0 Montgomery Humes 27 Male MontgomeryHumes 1 Dagmar Elstow 41 Female DagmarElstow 2 Reeba Wattisham 29 Female ReebaWattisham 3 Shalom Alen 29 Male ShalomAlen 4 Broddy Keningham 21 Male BroddyKeningham 5 Aurelia Brechin 33 Female AureliaBrechin
En este caso se puede ver que ha combinado el nombre y los apellidos sin dejar un espacio en medio, por lo que el resultado no es legible. Problema que se puede solucionar fácilmente mediante el uso de la propiedad sep
, mediante la cual es posible indicar una cadena para introducir entre las dos. De este modo, para introducir un espacio entre el nombre y el apellido solamente hay que hacer.
users['full_name'] = users.first_name.str.cat(users.last_name, sep=' ') users
first_name last_name age gender full_name 0 Montgomery Humes 27 Male Montgomery Humes 1 Dagmar Elstow 41 Female Dagmar Elstow 2 Reeba Wattisham 29 Female Reeba Wattisham 3 Shalom Alen 29 Male Shalom Alen 4 Broddy Keningham 21 Male Broddy Keningham 5 Aurelia Brechin 33 Female Aurelia Brechin
También es posible cambiar el orden, mostrar en primer lugar el apellido, e introducir una coma y un espacio entre los dos.
users['full_name'] = users.last_name.str.cat(users.first_name, sep=', ') users
first_name last_name age gender full_name 0 Montgomery Humes 27 Male Humes, Montgomery 1 Dagmar Elstow 41 Female Elstow, Dagmar 2 Reeba Wattisham 29 Female Wattisham, Reeba 3 Shalom Alen 29 Male Alen, Shalom 4 Broddy Keningham 21 Male Keningham, Broddy 5 Aurelia Brechin 33 Female Brechin, Aurelia
Uso el operador +
Alternativamente también es posible concatenar el contenido de dos series Pandas mediante el uso del operador +
. Un operador que, en el caso de grandes conjuntos de datos, es más eficiente que .str.cat()
.
users['full_name'] = users.last_name + ', ' + users.first_name users
first_name last_name age gender full_name 0 Montgomery Humes 27 Male Humes, Montgomery 1 Dagmar Elstow 41 Female Elstow, Dagmar 2 Reeba Wattisham 29 Female Wattisham, Reeba 3 Shalom Alen 29 Male Alen, Shalom 4 Broddy Keningham 21 Male Keningham, Broddy 5 Aurelia Brechin 33 Female Brechin, Aurelia
Conclusiones
En esta entrada se ha visto cómo combinar dos columnas de texto en Pandas, pudiendo usar para ellos tanto el método .str.cat()
como el operador +
. Una operación que es complementaria a separar texto en columnas con Pandas que se ha visto anteriormente.