In [800]:
import pandas as pd
import numpy as np 
In [801]:
df = pd.read_csv("C:/Users/sebro/Downloads/BD_Supervivencia.csv", encoding="latin-1")
df.head()
Out[801]:
Survived|Pclass|CP_Name|Sex|Age|Siblings/Spouses Aboard|Parents/Children Aboard|Fare|FROM TO/LUGGAGE-PET
0 B0|3|81912_Mr. Owen Harris Braund|M|22 years|1...
1 e1|_1|32137_Mrs. John Bradley (Florence Briggs...
2 e1|3 _|43466_Miss. Laina Heikkinen|female|26 y...
3 e1|_1|89597_Mrs. Jacques Heath (Lily May Peel)...
4 B0|3|95148_Mr. William Henry Allen|M|35 years|...
In [802]:
# Separamos la columna con el separador | 
cols = [
    'Survived', 'Pclass', 'CP_Name', 'Sex', 'Age',
    'Siblings/Spouses Aboard', 'Parents/Children Aboard',
    'Fare', 'FROM.TO.LUGGAGE.PET'
]

df[cols] = (
    df['Survived|Pclass|CP_Name|Sex|Age|Siblings/Spouses Aboard|Parents/Children Aboard|Fare|FROM TO/LUGGAGE-PET']
    .str.split('|', expand=True)
)

# Posteriormente eliminamos aquella columna inicial que contenía toda la información de la fila
df1 = df.drop(df.columns[0], axis = 1)

df1.dtypes
Out[802]:
Survived                   object
Pclass                     object
CP_Name                    object
Sex                        object
Age                        object
Siblings/Spouses Aboard    object
Parents/Children Aboard    object
Fare                       object
FROM.TO.LUGGAGE.PET        object
dtype: object
In [803]:
# Convirtamos las variables de Parents/Children Aboard y Siblings/Spouses a tipo numérico.
df1['Siblings/Spouses Aboard']  = pd.to_numeric(df1['Siblings/Spouses Aboard'])
df1['Parents/Children Aboard']  = pd.to_numeric(df1['Parents/Children Aboard'])

print('El tipo de dato de Siblings/Spouses Aboard es: ', df1['Parents/Children Aboard'].dtypes, ', y el tipo de dato de Parents/Children Aboard es: ', df1['Parents/Children Aboard'].dtypes)
El tipo de dato de Siblings/Spouses Aboard es:  int64 , y el tipo de dato de Parents/Children Aboard es:  int64
In [804]:
# Eliminar aquellas letras B, e dependiendo de la que toque. Una vez hecho esto, 
# tendremos caracteres en vez de números, entonces después de eliminar estas letras, 
# pasemos nuestros caracteres a números.

df1['Survived'] = df1['Survived'].str.slice(1, 2)
df1['Survived']  = pd.to_numeric(df1['Survived'])
df1[['Survived']].drop_duplicates()
Out[804]:
Survived
0 0
1 1
In [805]:
# Quitaremos sus signos que no nos importan, después de ésto quitaremos espacios para
# que solo nos queden los números para finalmente convertirlo a tipo de dato numérico
df1['Pclass'] = pd.to_numeric(
    df1['Pclass']
    .astype(str)
    .str.extract(r'(\d+)')[0],
    errors='coerce'
)

df1[['Pclass']].drop_duplicates()
Out[805]:
Pclass
0 3
1 1
9 2
In [806]:
# Ahora, para el campo CP_Name lo separaremos en dos, los primeros 5 dígitos en formato numérico
# y el nombre solo va a acontener solo letras, sin acentos y todo en mayúscula.

df1['CP'] = df1['CP_Name'].str.split('_', n=1).str[0]
df1['CP'] = pd.to_numeric(df1['CP'])
df1['Nombre'] = df1['CP_Name'].str.split(' ', n=1).str[1]

# Eliminamos la columna inicial
df1 = df1.drop(df1.columns[2], axis = 1)

df1[['CP','Nombre']].head()
Out[806]:
CP Nombre
0 81912 Owen Harris Braund
1 32137 John Bradley (Florence Briggs Thayer) Cumings
2 43466 Laina Heikkinen
3 89597 Jacques Heath (Lily May Peel) Futrelle
4 95148 William Henry Allen
In [807]:
# Como pudimos ver en la celda de arriba, tenemos varios registros de nombre en los que hay más nombres entre paréntesis
# para modificar esto, vamos a quedarnos con aquellos nombres que estén entre paréntesis.

parentesis = df1['Nombre'].str.contains(r'\(', na=False)

df1.loc[parentesis, 'Nombre'] = df1.loc[parentesis, 'Nombre'].str.extract(r'\(([^)]+)\)', expand=False)

df1['Nombre']
Out[807]:
0            Owen Harris Braund
1        Florence Briggs Thayer
2               Laina Heikkinen
3                 Lily May Peel
4           William Henry Allen
                 ...           
882             Juozas Montvila
883       Margaret Edith Graham
884    Catherine Helen Johnston
885            Karl Howell Behr
886              Patrick Dooley
Name: Nombre, Length: 887, dtype: object
In [808]:
# Ahora, si vemos el campo de Sexo, tendremos lo siguiente
df1['Sex'].unique()
# Vemos que no hay una sola forma de referirnos a los hombres o a las mujeres,
# por lo que para ello, haremos un cambio donde a todos los hombres se les identifique como M y a las mujeres como F
Out[808]:
array(['M', 'female', 'F', 'male'], dtype=object)
In [809]:
df1['Sex'] = (
    df1['Sex']
    .replace({
        'female': 'F',
        'male': 'M'
    }))

df1['Sex'].unique()

# Finalmente podemos ver como solo nos quedan una distinción para cada sexo
Out[809]:
array(['M', 'F'], dtype=object)
In [810]:
# Finalmente, veamos la variable de edad
df1['Age']
# Arreglaremos el campo de tal forma que solo tendrán datos numéricos de tipo entero.
Out[810]:
0          22 years
1          38 years
2          26 years
3          35 years
4          35 years
           ...     
882    27 years old
883    19 years old
884     7 years old
885    26 years old
886    32 years old
Name: Age, Length: 887, dtype: object
In [811]:
df1['Age'] = (
    df1['Age']
    .astype(str)
    .str.replace('years old', '', regex=False)
    .str.replace('years', '', regex=False)
    .str.strip()
)

df1['Age'] = pd.to_numeric(df1['Age'], errors='coerce').astype('int64')
df1['Age'].dtype
Out[811]:
dtype('int64')
In [812]:
# Finalmente, tenemos el campo de Fare, donde quitaremos los datos especiales como el de euro
# para que solo queden datos numéricos decimales.
df1['Fare']
Out[812]:
0         7.25 £
1      71.2833 £
2        7.925 £
3         53.1 £
4         8.05 £
         ...    
882         13 £
883         30 £
884      23.45 £
885         30 £
886       7.75 £
Name: Fare, Length: 887, dtype: object
In [813]:
df1['Fare'] = (
    np.floor(
        pd.to_numeric(
            df1['Fare'].astype(str).str.replace('£', '').str.strip(),
            errors='coerce'
        )))

df1['Fare']
Out[813]:
0       7.0
1      71.0
2       7.0
3      53.0
4       8.0
       ... 
882    13.0
883    30.0
884    23.0
885    30.0
886     7.0
Name: Fare, Length: 887, dtype: float64
In [814]:
# Finalmente, atacaremos la columna de 'FROM.TO.LUGGAGE.PET'
# lo separaremos en 4 columnas nuevas. 
# FROM: primera ciudad de donde parte
# TO: la segunda ciudad, hacia donde se dirige
# LUGGAGE: 1 si tiene equipaje, 0 si no.
# PET: Si si cuenta con equipaje documentado, 0 si no.

tmp = df1['FROM.TO.LUGGAGE.PET'].str.extract(
    r'From\s+(.*?)\s+to\s+(.*?)/(\d+)-(.*)'
)

tmp.columns = ['From', 'To', 'Luggage', 'Pet']
df1 = pd.concat([df1, tmp], axis=1)
df1 = df1.drop(df1.columns[7], axis = 1)
In [815]:
# Finalmente, podemos ver que, nuestros datos iniciales eran:
df.head()
Out[815]:
Survived|Pclass|CP_Name|Sex|Age|Siblings/Spouses Aboard|Parents/Children Aboard|Fare|FROM TO/LUGGAGE-PET Survived Pclass CP_Name Sex Age Siblings/Spouses Aboard Parents/Children Aboard Fare FROM.TO.LUGGAGE.PET
0 B0|3|81912_Mr. Owen Harris Braund|M|22 years|1... B0 3 81912_Mr. Owen Harris Braund M 22 years 1 0 7.25 £ From Southampton to Queenstown/1-no
1 e1|_1|32137_Mrs. John Bradley (Florence Briggs... e1 _1 32137_Mrs. John Bradley (Florence Briggs Thaye... female 38 years 1 0 71.2833 £ From Southampton to Queenstown/0-Si
2 e1|3 _|43466_Miss. Laina Heikkinen|female|26 y... e1 3 _ 43466_Miss. Laina Heikkinen female 26 years 0 0 7.925 £ From Southampton to Cherburgo/0-no
3 e1|_1|89597_Mrs. Jacques Heath (Lily May Peel)... e1 _1 89597_Mrs. Jacques Heath (Lily May Peel) Futrelle female 35 years 1 0 53.1 £ From Southampton to Cherburgo/0-Si
4 B0|3|95148_Mr. William Henry Allen|M|35 years|... B0 3 95148_Mr. William Henry Allen M 35 years 0 0 8.05 £ From Southampton to Queenstown/0-Si
In [816]:
# Terminando de la siguiente forma
df1.head()
Out[816]:
Survived Pclass Sex Age Siblings/Spouses Aboard Parents/Children Aboard Fare CP Nombre From To Luggage Pet
0 0 3 M 22 1 0 7.0 81912 Owen Harris Braund Southampton Queenstown 1 no
1 1 1 F 38 1 0 71.0 32137 Florence Briggs Thayer Southampton Queenstown 0 Si
2 1 3 F 26 0 0 7.0 43466 Laina Heikkinen Southampton Cherburgo 0 no
3 1 1 F 35 1 0 53.0 89597 Lily May Peel Southampton Cherburgo 0 Si
4 0 3 M 35 0 0 8.0 95148 William Henry Allen Southampton Queenstown 0 Si