{ "cells": [ { "cell_type": "markdown", "id": "8dcdca06", "metadata": {}, "source": [ "# Manejar datos nulos" ] }, { "cell_type": "code", "execution_count": 1, "id": "354a12ad", "metadata": { "tags": [ "remove-cell" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/jairoantonio/opt/anaconda3/lib/python3.9/site-packages/IPython/core/interactiveshell.py:3444: DtypeWarning: Columns (11) have mixed types.Specify dtype option on import or set low_memory=False.\n", " exec(code_obj, self.user_global_ns, self.user_ns)\n" ] } ], "source": [ "import pandas as pd\n", "\n", "muestra_covid = pd.read_csv('../data/muestra_covid.csv')\n", "geolocalizacion = pd.read_csv('../data/geolocalizacion.csv')" ] }, { "cell_type": "markdown", "id": "23d8e37e", "metadata": {}, "source": [ "Los datos nulos corresponden a información que no se consignó, ya fuese en la creación del archivo o en la entrada de datos. Nuevamente, esta es una decisión de diseño del modelo de datos y no todos los casos son iguales, así que hay que tener en cuenta que no todos los conjuntos de datos requerirán las mismas acciones.\n", "\n", "## `dropna()`\n", "\n", "Esta función elimina los valores nulos de un conjunto de datos. Su sintaxis es:\n", "\n", "```python\n", "df.dropna()\n", "```\n", "\n", "Por ejemplo, si la aplicamos a los datos de `muestra_covid` tendremos el siguiente resultado:" ] }, { "cell_type": "code", "execution_count": 2, "id": "86f7d45f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(783, 12)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0sexoedadentidad_nacimientomunicipio_residenciaindigenanacionalidadmigrantepais_nacionalidadfecha_ingresofecha_sintomasfecha_def
337337HOMBRE84OAXACAnezahualcóyotlNOMEXICANANO ESPECIFICADOMÉXICO2022-01-062021-12-242022-01-14
12481248MUJER71HIDALGOtlanepantlaNOMEXICANANO ESPECIFICADOMÉXICO2022-01-012021-12-272022-01-12
12491249MUJER79MÉXICOnezahualcóyotlNOMEXICANANO ESPECIFICADOMÉXICO2022-01-012021-12-252022-01-07
23052305HOMBRE87MÉXICOecatepec de morelosNOMEXICANANO ESPECIFICADOMÉXICO2022-01-022021-12-232022-01-03
24782478HOMBRE34MÉXICOtlalnepantla de bazNOMEXICANANO ESPECIFICADOMÉXICO2022-01-022021-12-302022-01-03
\n", "
" ], "text/plain": [ " Unnamed: 0 sexo edad entidad_nacimiento municipio_residencia \\\n", "337 337 HOMBRE 84 OAXACA nezahualcóyotl \n", "1248 1248 MUJER 71 HIDALGO tlanepantla \n", "1249 1249 MUJER 79 MÉXICO nezahualcóyotl \n", "2305 2305 HOMBRE 87 MÉXICO ecatepec de morelos \n", "2478 2478 HOMBRE 34 MÉXICO tlalnepantla de baz \n", "\n", " indigena nacionalidad migrante pais_nacionalidad fecha_ingreso \\\n", "337 NO MEXICANA NO ESPECIFICADO MÉXICO 2022-01-06 \n", "1248 NO MEXICANA NO ESPECIFICADO MÉXICO 2022-01-01 \n", "1249 NO MEXICANA NO ESPECIFICADO MÉXICO 2022-01-01 \n", "2305 NO MEXICANA NO ESPECIFICADO MÉXICO 2022-01-02 \n", "2478 NO MEXICANA NO ESPECIFICADO MÉXICO 2022-01-02 \n", "\n", " fecha_sintomas fecha_def \n", "337 2021-12-24 2022-01-14 \n", "1248 2021-12-27 2022-01-12 \n", "1249 2021-12-25 2022-01-07 \n", "2305 2021-12-23 2022-01-03 \n", "2478 2021-12-30 2022-01-03 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sin_nulos = muestra_covid.dropna()\n", "print(sin_nulos.shape)\n", "sin_nulos.head()" ] }, { "cell_type": "markdown", "id": "1c07ae82", "metadata": {}, "source": [ "Ahora tenemos un conjunto de datos más sintetizado. Demasiado sintético diría yo. El inconveniente con usar este método de manera simple es que cualquier fila que contenga un valor nulo será eliminada. Por lo tanto, solamente tendremos 783 casos en los que toda la información es válida. \n", "\n", "Una solución menos \"radical\" podría ser eliminar los valores nulos solamente de una columna, por ejemplo, `municipio_residencia`:" ] }, { "cell_type": "code", "execution_count": 3, "id": "7ee684eb", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(149707, 12)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0sexoedadentidad_nacimientomunicipio_residenciaindigenanacionalidadmigrantepais_nacionalidadfecha_ingresofecha_sintomasfecha_def
77MUJER75QUERÉTAROnaucalpan de juárezNOMEXICANANO ESPECIFICADOMÉXICO2022-02-212022-02-16NaN
1010HOMBRE40CIUDAD DE MÉXICOatizapánNOMEXICANANO ESPECIFICADOMÉXICO2022-05-192022-05-19NaN
2323MUJER9CIUDAD DE MÉXICOzumpangoNOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-07NaN
2424MUJER40GUERREROzumpangoNOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-08NaN
2525MUJER13CIUDAD DE MÉXICOnezahualcóyotlNOMEXICANANO ESPECIFICADOMÉXICO2022-01-262022-01-26NaN
\n", "
" ], "text/plain": [ " Unnamed: 0 sexo edad entidad_nacimiento municipio_residencia indigena \\\n", "7 7 MUJER 75 QUERÉTARO naucalpan de juárez NO \n", "10 10 HOMBRE 40 CIUDAD DE MÉXICO atizapán NO \n", "23 23 MUJER 9 CIUDAD DE MÉXICO zumpango NO \n", "24 24 MUJER 40 GUERRERO zumpango NO \n", "25 25 MUJER 13 CIUDAD DE MÉXICO nezahualcóyotl NO \n", "\n", " nacionalidad migrante pais_nacionalidad fecha_ingreso \\\n", "7 MEXICANA NO ESPECIFICADO MÉXICO 2022-02-21 \n", "10 MEXICANA NO ESPECIFICADO MÉXICO 2022-05-19 \n", "23 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "24 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "25 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-26 \n", "\n", " fecha_sintomas fecha_def \n", "7 2022-02-16 NaN \n", "10 2022-05-19 NaN \n", "23 2022-01-07 NaN \n", "24 2022-01-08 NaN \n", "25 2022-01-26 NaN " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sin_nulos = muestra_covid.dropna(subset=['municipio_residencia'])\n", "print(sin_nulos.shape)\n", "sin_nulos.head()" ] }, { "cell_type": "markdown", "id": "c0738eaf", "metadata": {}, "source": [ "En este caso tendremos un número un tanto más significativo de casos (149,707).\n", "\n", "Aparentemente hemos perdido mucha información, pero en realidad hemos segmentado el conjunto de datos para seleccionar solamente aquellos que podamos representar en un mapa. Como conservamos nuestro conjunto de datos original, incluso nuestro dataframe segmentado (`muestra_covid`), no debemos preocuparnos por perder la información de sexo, edad, etc; que no esté asociada a una ubicación geográfica.\n", "\n", "## `fillna()`\n", "\n", "Otra función para lidiar con valores nulos es `fillna()`. Esta función reemplaza los valores nulos por un valor específico. Su sintaxis es:\n", "\n", "```python\n", "df.fillna(valor)\n", "```\n", "\n", "Ciertas operaciones en `pandas` no pueden lidiar con datos nulos, pero no siempre (como vimos arriba) podemos eliminar esos campos. Por esa razón, esta función permite llenar estos campos con un valor constante con el que podremos trabajar posteriormente. \n", "\n", "```{admonition} Una aclaración\n", ":class: tip\n", "Aunque podemos asignar cualquier valor a `fillna()` es importante que seamos coherentes con el tipo de dato de la columna que estamos transformando. Por ejemplo, si la columna `fecha_diagnostico` es de tipo `int64`, entonces `fillna()` debe ser de tipo `int64`. \n", "\n", "Además, en todos los casos, el valor debe ser similar a un valor nulo. Por ejemplo, `0` o `'N/A'` son valores que pueden reemplazar a un valor nulo. \n", "```\n", "\n", "Al igual que en `dropna()` si usamos un valor indistintamente de la columna, se reemplazarán todos los valores nulos de todo el dataframe:" ] }, { "cell_type": "code", "execution_count": 4, "id": "7f1ede78", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0sexoedadentidad_nacimientomunicipio_residenciaindigenanacionalidadmigrantepais_nacionalidadfecha_ingresofecha_sintomasfecha_def
00HOMBRE43CIUDAD DE MÉXICON/ANOMEXICANANO ESPECIFICADOMÉXICO2022-05-032022-05-03N/A
11HOMBRE39CIUDAD DE MÉXICON/ANOMEXICANANO ESPECIFICADOMÉXICO2022-01-132022-01-10N/A
22HOMBRE55CIUDAD DE MÉXICON/ANOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-12N/A
33HOMBRE54CIUDAD DE MÉXICON/ANOMEXICANANO ESPECIFICADOMÉXICO2022-02-202022-02-13N/A
44MUJER41CIUDAD DE MÉXICON/ANOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-10N/A
\n", "
" ], "text/plain": [ " Unnamed: 0 sexo edad entidad_nacimiento municipio_residencia indigena \\\n", "0 0 HOMBRE 43 CIUDAD DE MÉXICO N/A NO \n", "1 1 HOMBRE 39 CIUDAD DE MÉXICO N/A NO \n", "2 2 HOMBRE 55 CIUDAD DE MÉXICO N/A NO \n", "3 3 HOMBRE 54 CIUDAD DE MÉXICO N/A NO \n", "4 4 MUJER 41 CIUDAD DE MÉXICO N/A NO \n", "\n", " nacionalidad migrante pais_nacionalidad fecha_ingreso \\\n", "0 MEXICANA NO ESPECIFICADO MÉXICO 2022-05-03 \n", "1 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-13 \n", "2 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "3 MEXICANA NO ESPECIFICADO MÉXICO 2022-02-20 \n", "4 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "\n", " fecha_sintomas fecha_def \n", "0 2022-05-03 N/A \n", "1 2022-01-10 N/A \n", "2 2022-01-12 N/A \n", "3 2022-02-13 N/A \n", "4 2022-01-10 N/A " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nulos_reemplazados = muestra_covid.fillna('N/A')\n", "nulos_reemplazados.head()" ] }, { "cell_type": "markdown", "id": "efa16869", "metadata": {}, "source": [ "En este caso, el reemplazo en `municipio_residencia` es claro, pero en `fecha_def` puede llevar a errores (por ejemplo, cuando tratemos de cambiar los valores de `fecha_def` a `datetime64[ns]`). Otro inconveniente es que no es posible establecer una fecha `0` (recuerda lo que dijimos al respecto en la sección dedicada a [variables cuantitativas y cualitativas](../S2-estructuras-preparacion/S2P5-operaciones-datos.md) sobre las escalas de intervalo). Por lo que en este caso, la decisión más adecuada podría ser reemplazar únicamente los valores nulos de la columna `municipio_residencia` con `'NO APLICA'`." ] }, { "cell_type": "code", "execution_count": 5, "id": "25aa2ef4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0sexoedadentidad_nacimientomunicipio_residenciaindigenanacionalidadmigrantepais_nacionalidadfecha_ingresofecha_sintomasfecha_def
00HOMBRE43CIUDAD DE MÉXICONO APLICANOMEXICANANO ESPECIFICADOMÉXICO2022-05-032022-05-03NaN
11HOMBRE39CIUDAD DE MÉXICONO APLICANOMEXICANANO ESPECIFICADOMÉXICO2022-01-132022-01-10NaN
22HOMBRE55CIUDAD DE MÉXICONO APLICANOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-12NaN
33HOMBRE54CIUDAD DE MÉXICONO APLICANOMEXICANANO ESPECIFICADOMÉXICO2022-02-202022-02-13NaN
44MUJER41CIUDAD DE MÉXICONO APLICANOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-10NaN
\n", "
" ], "text/plain": [ " Unnamed: 0 sexo edad entidad_nacimiento municipio_residencia indigena \\\n", "0 0 HOMBRE 43 CIUDAD DE MÉXICO NO APLICA NO \n", "1 1 HOMBRE 39 CIUDAD DE MÉXICO NO APLICA NO \n", "2 2 HOMBRE 55 CIUDAD DE MÉXICO NO APLICA NO \n", "3 3 HOMBRE 54 CIUDAD DE MÉXICO NO APLICA NO \n", "4 4 MUJER 41 CIUDAD DE MÉXICO NO APLICA NO \n", "\n", " nacionalidad migrante pais_nacionalidad fecha_ingreso \\\n", "0 MEXICANA NO ESPECIFICADO MÉXICO 2022-05-03 \n", "1 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-13 \n", "2 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "3 MEXICANA NO ESPECIFICADO MÉXICO 2022-02-20 \n", "4 MEXICANA NO ESPECIFICADO MÉXICO 2022-01-12 \n", "\n", " fecha_sintomas fecha_def \n", "0 2022-05-03 NaN \n", "1 2022-01-10 NaN \n", "2 2022-01-12 NaN \n", "3 2022-02-13 NaN \n", "4 2022-01-10 NaN " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nulos_reemplazados = muestra_covid.fillna({'municipio_residencia': 'NO APLICA'}) # usamos 'NO APLICA' como valor pues es el que se utiliza en el dataset original para otras categorías\n", "nulos_reemplazados.head()" ] }, { "cell_type": "markdown", "id": "cd7f0411", "metadata": {}, "source": [ "## ¿Cómo saber cuáles columnas tienen valores nulos?\n", "\n", "En conjuntos grandes de datos, es posible que no identifiquemos un valor nulo hasta el momento que nos encontremos con un mensaje de error. Por esta razón, es probable que queramos obtener las columnas que tengan valores nulos antes de proceder con un dataframe. Para ello, podemos usar la función `isnull()` aplicada a una columna en específico, combinada con el método `.loc`:" ] }, { "cell_type": "code", "execution_count": 6, "id": "3d857277", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0sexoedadentidad_nacimientomunicipio_residenciaindigenanacionalidadmigrantepais_nacionalidadfecha_ingresofecha_sintomasfecha_def
00HOMBRE43CIUDAD DE MÉXICONaNNOMEXICANANO ESPECIFICADOMÉXICO2022-05-032022-05-03NaN
11HOMBRE39CIUDAD DE MÉXICONaNNOMEXICANANO ESPECIFICADOMÉXICO2022-01-132022-01-10NaN
22HOMBRE55CIUDAD DE MÉXICONaNNOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-12NaN
33HOMBRE54CIUDAD DE MÉXICONaNNOMEXICANANO ESPECIFICADOMÉXICO2022-02-202022-02-13NaN
44MUJER41CIUDAD DE MÉXICONaNNOMEXICANANO ESPECIFICADOMÉXICO2022-01-122022-01-10NaN
.......................................
13234961323496HOMBRE48CIUDAD DE MÉXICONaNNO ESPECIFICADOMEXICANANO ESPECIFICADOMÉXICO2022-01-052022-01-01NaN
13234971323497HOMBRE27CIUDAD DE MÉXICONaNNO ESPECIFICADOMEXICANANO ESPECIFICADOMÉXICO2022-01-042022-01-01NaN
13234981323498MUJER46CIUDAD DE MÉXICONaNNO ESPECIFICADOMEXICANANO ESPECIFICADOMÉXICO2022-01-052022-01-01NaN
13234991323499MUJER33CIUDAD DE MÉXICONaNNO ESPECIFICADOMEXICANANO ESPECIFICADOMÉXICO2022-01-052022-01-01NaN
13235001323500HOMBRE34MÉXICONaNNO ESPECIFICADOMEXICANANO ESPECIFICADOMÉXICO2022-01-272022-01-27NaN
\n", "

1319912 rows × 12 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 sexo edad entidad_nacimiento municipio_residencia \\\n", "0 0 HOMBRE 43 CIUDAD DE MÉXICO NaN \n", "1 1 HOMBRE 39 CIUDAD DE MÉXICO NaN \n", "2 2 HOMBRE 55 CIUDAD DE MÉXICO NaN \n", "3 3 HOMBRE 54 CIUDAD DE MÉXICO NaN \n", "4 4 MUJER 41 CIUDAD DE MÉXICO NaN \n", "... ... ... ... ... ... \n", "1323496 1323496 HOMBRE 48 CIUDAD DE MÉXICO NaN \n", "1323497 1323497 HOMBRE 27 CIUDAD DE MÉXICO NaN \n", "1323498 1323498 MUJER 46 CIUDAD DE MÉXICO NaN \n", "1323499 1323499 MUJER 33 CIUDAD DE MÉXICO NaN \n", "1323500 1323500 HOMBRE 34 MÉXICO NaN \n", "\n", " indigena nacionalidad migrante pais_nacionalidad \\\n", "0 NO MEXICANA NO ESPECIFICADO MÉXICO \n", "1 NO MEXICANA NO ESPECIFICADO MÉXICO \n", "2 NO MEXICANA NO ESPECIFICADO MÉXICO \n", "3 NO MEXICANA NO ESPECIFICADO MÉXICO \n", "4 NO MEXICANA NO ESPECIFICADO MÉXICO \n", "... ... ... ... ... \n", "1323496 NO ESPECIFICADO MEXICANA NO ESPECIFICADO MÉXICO \n", "1323497 NO ESPECIFICADO MEXICANA NO ESPECIFICADO MÉXICO \n", "1323498 NO ESPECIFICADO MEXICANA NO ESPECIFICADO MÉXICO \n", "1323499 NO ESPECIFICADO MEXICANA NO ESPECIFICADO MÉXICO \n", "1323500 NO ESPECIFICADO MEXICANA NO ESPECIFICADO MÉXICO \n", "\n", " fecha_ingreso fecha_sintomas fecha_def \n", "0 2022-05-03 2022-05-03 NaN \n", "1 2022-01-13 2022-01-10 NaN \n", "2 2022-01-12 2022-01-12 NaN \n", "3 2022-02-20 2022-02-13 NaN \n", "4 2022-01-12 2022-01-10 NaN \n", "... ... ... ... \n", "1323496 2022-01-05 2022-01-01 NaN \n", "1323497 2022-01-04 2022-01-01 NaN \n", "1323498 2022-01-05 2022-01-01 NaN \n", "1323499 2022-01-05 2022-01-01 NaN \n", "1323500 2022-01-27 2022-01-27 NaN \n", "\n", "[1319912 rows x 12 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "es_nula = muestra_covid.loc[muestra_covid['fecha_def'].isnull()]\n", "es_nula" ] }, { "cell_type": "markdown", "id": "61b863b0", "metadata": {}, "source": [ "Puedes combinar este método con un loop para obtener una lista de las columnas que contienen valores nulos:" ] }, { "cell_type": "code", "execution_count": 7, "id": "e92364dd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['municipio_residencia', 'fecha_def']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nulas = []\n", "for col in muestra_covid:\n", " if muestra_covid[col].isnull().any(): # la función `any()` devuelve `True` si alguna de las filas contiene un valor nulo\n", " nulas.append(col)\n", "nulas" ] }, { "cell_type": "markdown", "id": "8461bd53", "metadata": {}, "source": [ "Este loop lo puedes aplicar a cualquier dataframe, sin importar la cantidad de columnas que tenga." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "formats": "md:myst", "text_representation": { "extension": ".md", "format_name": "myst", "format_version": 0.13, "jupytext_version": "1.14.0" } }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" }, "source_map": [ 14, 18, 24, 38, 42, 48, 52, 77, 80, 84, 87, 93, 96, 100, 106 ] }, "nbformat": 4, "nbformat_minor": 5 }