- 1. Ejercicio 01
- 2. Solución
- 3. Recursos
- 4. Enlaces externos
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
- 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. - 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:
- Las dimensiones del DataFrame (shape).
- El número de datos que contiene (size).
- Los nombres de sus columnas (columns).
- Los nombres de sus filas (index).
- Los tipos de datos de las columnas (dtypes).
- Las 10 primeras filas (head).
- 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)