Cómo leer tablas HTML con pandas

Imaginate estar buscando datos para después trabajarlos en Python y justo la data que necesitás la encontrás en una tabla en una página de Wikipedia, por ejemplo. ¿Qué hacés?

Guillermina Sutter Schneider
4 min readSep 23, 2020
Crédito: Real Python

Imaginate estar buscando datos para después trabajarlos en Python y justo la data que necesitás la encontrás en una tabla en una página de Wikipedia, por ejemplo. ¿Qué hacés? ¿Los copiás y pegás en un Excel y después leés ese archivo con Pyhton? ¿Usás Beautiful Soup para buscar el tag HTML de la tabla que necesitás y después pasás los datos a un dataframe en pandas? ¿Creás el dataframe a mano? Podrías… Pero hay una solución más eficiente.

Encontré este tweet de Chris Moffitt que explica cómo leer tablas en HTML usando pandas, y como no había nada parecido en español, me pareció bueno escribir este mini tutorial.

Leer la tabla HTML

Para empezar, hay que importar pandas y tener a mano el URL de la página con la tabla que queremos leer en pandas. En este caso, voy a usar el artículo de Wikipedia List of countries by inflation rate (Lista de países ordenados por tasa de inflación).

Artículo de Wikipedia List of countries by inflation rate (Lista de países ordenados por tasa de inflación)

Una vez que tenemos estas cosas, podemos empezar a ver cuántas tablas hay en la página y además podemos imprimir las primeras filas de cada tabla.

¡ATENCIÓN! Si estás corriendo el código en MacOS y te sale el error de abajo, te recomiendo seguir estos pasos para solucionarlo.

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)>

Seleccionar la tabla para trabajar

Ahora que ya identificamos la tabla con la que queremos trabajar (la tabla número 2), hay que seleccionarla y transformarla en un dataframe de pandas. También podemos ir investigando cuáles son las características del dataframe: número de filas y columnas, tipos de columnas, etc.

Si imprimimos en la consola las primeras filas del dataframe obtenemos:

  Country / Territory   Inflation rate   Date of information
0 Andorra -0.9 2015 est.
1 Chad -0.9 2017 est.
2 Saudi Arabia -0.9 2017 est.
3 Togo -0.7 2017 est.
4 American Samoa -0.5 2015 est.

El dataframe tiene 227 filas y 3 columnas (227, 3). Las características generales del dataframe son:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 227 entries, 0 to 226
Data columns (total 3 columns):
Country / Territory 227 non-null object
Inflation rate 227 non-null object
Date of information 227 non-null object
dtypes: object(3)
memory usage: 5.4+ KB
None

Tenemos que limpiar un poco los datos… Específicamente, hay convertir la columna con las tasas de inflación a valores numéricos y eliminar la palabra “est.” de la última columna que muestra las fechas.

En términos generales, lo que hace ese for loop en el caso de la columna con las tasas de inflación, es leer cada valor de la columna, identificar si hay un signo negativo, reemplazarlo por el que corresponde y luego agregar el valor ya limpio a una lista que se asigna a la columna de inflación.

Algo similar se hace con la columna de los años. A cada valor le eliminamos “est.” y después sacamos cualquier caracter no numérico que haya quedado en la parte restante.

Dataframe limpio

Una vez que hicimos esto, tenemos el dataframe listo para trabajarlo y analizarlo más en profundidad. Como ese no es el objetivo de este artículo, no voy a entrar más en detalles sobre el análisis, pero sí podemos rápidamente ver cuáles son los países con menor y mayor inflación.

Primero ordenamos el dataframe con los valores de inflación de menor a mayor y luego creamos dos dataframes. El primero con los 10 países con tasas de inflación más bajas:

  Country / Territory    Inflation rate    Date of information
0 Andorra -0.9 2015
1 Chad -0.9 2017
2 Saudi Arabia -0.9 2017
3 Togo -0.7 2017
4 American Samoa -0.5 2015
5 Liechtenstein -0.4 2016
6 Solomon Islands -0.4 2017
7 Faroe Islands -0.3 2016
8 Aruba -0.1 2017
9 Brunei -0.1 2017

El otro dataframe con los 10 países con las tasas de inflación más altas:

    Country / Territory    Inflation rate    Date of information
217 Syria 25.5 2017
218 Iran 26.0 2020
219 Libya 28.0 2017
220 Angola 31.7 2017
221 Sudan 32.4 2017
222 Congo, Dem. Rep. 41.5 2017
223 South Sudan 48.0 2019
224 Argentina 54.8 2020
225 Zimbabwe 161.8 2019
226 Venezuela 200000.0 2020

Otras cosas que se pueden hacer son gráficos de barras para poder comparar mejor las inflaciones entre países, combinar los datos de esta tabla con los de otra y ver cómo fue la evolución de la inflación en los últimos años, qué país logró disminuir su inflación y cuál no, etc.

Podés encontrar el repo entero acá.

--

--

Guillermina Sutter Schneider

Argentine data scientist living in Berlin. I like numbers, dataviz, and Germany. Not necessarily in that order.