1. Ejercicio 01

El fichero titanic.csv contiene información sobre los pasajeros del Titanic.

Solución a todos los ejercicios: src/01.py.

Escribir un programa con los siguientes requisitos:

1.1. 01

  1. Generar un DataFrame con los datos del fichero usando la función de Pandas pandas.read_csv, almacenar el DF en una variabla llamada titanic.
  2. Imprimir el contenido de la variable por pantalla.

1.1.1. Solución

titanic = pd.read_csv('titanic.csv', index_col=0)
print(titanic)

1.2. 02

Mostrar por pantalla una vez cada información solicitada:

  1. Las dimensiones del DataFrame (shape).
  2. El número de datos que contiene (size).
  3. Los nombres de sus columnas (columns).
  4. Los nombres de sus filas (index).
  5. Los tipos de datos de las columnas (dtypes).
  6. Las 10 primeras filas (head).
  7. Las 10 últimas filas (tail).

1.2.1. Solución

print('Dimensiones:', titanic.shape)
print('Número de elemntos:', titanic.size)
print('Nombres de columnas:', titanic.columns)
print('Nombres de filas:', titanic.index)
print('Tipos de datos:\n', titanic.dtypes)
print('Primeras 10 filas:\n', titanic.head(10))
print('Últimas 10 filas:\n', titanic.tail(10))

1.3. 03

Mostrar por pantalla los datos del pasajero con identificador 148 (loc).

1.3.1. Solución

Usamos pandas.DataFrame.loc para indexar por el índice.

print(titanic.loc[148])

El registro de salida corresponde a:

148,0,3,"Ford, Miss. Robina Maggie ""Ruby""",female,9,2,2,W./C. 6608,34.375,,S

1.4. 04

Mostrar por pantalla las filas pares del DataFrame. Usar (iloc indexado con range).

1.4.1. Solución

print(titanic.iloc[range(0,titanic.shape[0],2)])

Con la función range creamos una secuencia de números con un salto de 2 desde 0 al número de registros del DF (titanic.shape[0])

Se puede simplicar así para verlo más claro:

In [4]: num_registros=titanic.shape[0]

In [5]: print(num_registros)
891

In [6]: range(0,num_registros,2)
Out[6]: range(0, 891, 2)

A continuación usaremos la secuencia generada para indexar por ìndice con iloc[].

1.5. 05

Mostrar por pantalla los nombres de las personas que iban en primera clase (Pclass igual a 1) ordenadas alfabéticamente (indexación booleana y sort_values).

1.5.1. Solución

print(titanic[titanic["Pclass"]==1]['Name'].sort_values())

Con titanic["Pclass"]==1 obtenemos una Serie de Pandas con valores booleanos obtenidos de la comparación lógica ==.

In [10]: titanic["Pclass"]==1
Out[10]: 
PassengerId
1      False
2       True
3      False
4       True
5      False
       ...  
887    False
888     True
889    False
890     True
891    False
Name: Pclass, Length: 891, dtype: bool

La Serie la usamos para indexar sobre el DF titanic[titanic["Pclass"]==1] obteniendo los registros sólo de los pasajeros de 1º clase. Finalmente obtenemos sus nombres titanic[titanic["Pclass"]==1]['Name'] y ordenamos los valores con le método sort_values.

1.6. 06

Mostrar por pantalla el porcentaje de personas que sobrevivieron Survived (igual a 1) y murieron (igual a 0) (indexación de columna y aplicación de método value_counts), total registros / supervivientes * 100.

1.6.1. Solución

print(titanic['Survived'].value_counts()/titanic['Survived'].count() * 100)

pandas.DataFrame.value_counts retorna una Serie que contiene cantidad de filas únicas en un DF. Si tenemos dos valores posibles de ‘Survived’ (1 o 0) retornará una serie con la cantidad de cada uno de ellos.

In [14]: titanic['Survived'].value_counts()
Out[14]: 
0    549
1    342
Name: Survived, dtype: int64

Luego solo tenemos que aplicar la operación de división con el total titanic['Survived'].count() y multiplicar por 100.

Registros totales:

In [15]: titanic['Survived'].count()
Out[15]: 891

1.7. 07

Mostrar por pantalla el porcentaje de personas que sobrevivieron en cada clase.

Agrupar por clase Pclass con groupby y aplicar value_counts

1.7.1. Solución

titanic.groupby('Pclass')['Survived'].value_counts(normalize=True)

Agrupamos por la columna ‘Pclass’. Podemos analizar los grupos formados por clase con:

In [18]: print(titanic.groupby('Pclass').groups
    ...: )
{1: [2, 4, 7, 12, 24, 28, 31, 32, 35, 36, 53, 55, 56, 62, 63, 65, 84, 89, 93, 97, 98, 103, 111, 119, 125, 137, 138, 140, 152, 156, 167, 169, 171, 175, 178, 186, 188, 195, 196, 210, 216, 219, 225, 231, 246, 249, 253, 257, 258, 259, 263, 264, 269, 270, 271, 274, 276, 285, 291, 292, 296, 298, 299, 300, 306, 307, 308, 310, 311, 312, 319, 320, 326, 330, 332, 333, 335, 337, 338, 340, 342, 352, 357, 367, 370, 371, 374, 376, 378, 381, 384, 391, 394, 413, 431, 435, 436, 439, 446, 448, ...], 2: [10, 16, 18, 21, 22, 34, 42, 44, 54, 57, 59, 67, 71, 73, 79, 85, 99, 100, 118, 121, 123, 124, 134, 135, 136, 145, 146, 149, 150, 151, 162, 179, 182, 184, 191, 192, 194, 200, 212, 214, 218, 220, 222, 227, 229, 233, 235, 237, 238, 239, 240, 243, 248, 250, 260, 266, 273, 278, 289, 293, 304, 309, 313, 315, 317, 318, 323, 324, 328, 341, 343, 344, 345, 346, 347, 358, 362, 386, 388, 390, 398, 399, 400, 406, 408, 414, 417, 418, 419, 427, 428, 433, 438, 440, 441, 444, 447, 451, 459, 464, ...], 3: [1, 3, 5, 6, 8, 9, 11, 13, 14, 15, 17, 19, 20, 23, 25, 26, 27, 29, 30, 33, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 50, 51, 52, 58, 60, 61, 64, 66, 68, 69, 70, 72, 74, 75, 76, 77, 78, 80, 81, 82, 83, 86, 87, 88, 90, 91, 92, 94, 95, 96, 101, 102, 104, 105, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 120, 122, 126, 127, 128, 129, 130, 131, 132, 133, 139, 141, 142, 143, 144, 147, 148, 153, 154, 155, 157, 158, 159, 160, ...]}

La clave principal es la clase y las listas de cada clase son los índices de los registros del DF que pertenecen a esa clase.

1.8. 08

Eliminar del DataFrame los pasajeros con edad Age desconocida (NaN) con dropna y subset.

1.8.1. Solución

titanic.dropna(subset=['Age'])

1.9. 09 (no hacer)

Mostrar por pantalla la edad media de las mujeres que viajaban en cada clase. Agrupar con groupby basado en dos criterios Pclass y Sex. Sobre la agrupación seleccionar por indexación Age y aplicar value_counts….

1.10. 10

Añadir una nueva columna booleana Young para ver si el pasajero era menor de edad o no. Indexación booleana de Age y asignar a nueva columna.

1.10.1. Solución

titanic['Young'] = titanic['Age'] < 18

1.11. 11

Mostrar por pantalla el porcentaje de menores y mayores de edad que sobrevivieron en cada clase. Agrupar con groupby

1.11.1. Solución

print(titanic.groupby(['Pclass', 'Young'])['Survived'].value_counts(normalize = True) * 100)

2. Solución

3. Recursos

4. Enlaces externos