Tablas dinámicas en Python
con Pandas
Una de las cosa más útiles que he encontrado en las hojas de cálculo (llámese EXCEL o LIBREOFFICE CALC), son las tablas dinámicas para el tratamiento masivo de datos. Podemos resúmenes y analizar los datos que tenemos, para llegar a conclusiones y extraer la información que nos sea necesaria.
¿pero se puede prescindir de hojas de cálculo, y hacerlo mismo mediante un lenguaje de programación? La respuesta es SI, y en Python tenemos la libreria PANDAS, que nos permite hacer lo mismo.
A continuación os dejo un ejemplo con varios comentarios y "trucos" que yo he encontrado sobre el ejemplo original (os dejo al final de este articulo la referencia a la fuente original).
Ejemplo:
Tenemos un conjunto de datos sobre paises, continentes, población esperanza de vida, continente, etc... y necesitamos obtener varios datos:
1) esperanza de vida media por continente
2) esperanza de vida media por pais
3) esperanza de vida media por año y continente
4) esperanza de vida por año, continente, y agregando funcion minima y maxima.
Solución:
0) Lo primero que tenemos que hacer es cargar la libreria pandas desde nuestro programa (o consola de python):
import pandas as pd
Una vez hecho esto, vamos a crear una variable que contenga la ruta de los datos. En el ejemplo original, lo datos están alojados en en una dirección de internet:
data_url='https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csv'Nota:
El archivo esta en internet (en https://github.com/resbaz/r-novice-gapminder-files/blob/master/data/gapminder-FiveYearData.csv) , pero podemos descargarlo a nuestro ordenador en modo "raw", por ejemplo usando el comando wget
wget https://raw.githubusercontent.com/resbaz/r-novice-gapminder-files/master/data/gapminder-FiveYearData.csvy cambiar la ruta apuntando al lugar donde lo hemos descargado
data_url='/home/nombre_usuario/Descargas/gapminder-FiveYearData.csv'
Y ahora lo leemos:
datos=pd.read_csv(data_url)
Podemos ver los datos leidos, usando el comando print:
print(datos.head(5))Salida generada (las 5 primeras filas del archivo):
Ahora vamos a los puntos a resolver:
1) esperanza de vida media por continente
Para ello hacemos un subconjunto de datos, con las columnas cotinent y lifeExp
subdatos=datos[['continent','lifeExp']]
y creamos una variable con el resultado de la tabla dinamica:
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='continent')
y mostramos el resultado de esa tabla dinamica:
print(tabla)
El resultado seria:
2) esperanza de vida media por pais
Para ello hacemos un subconjunto de datos, con las columnas country y lifeExp
subdatos=datos[['country','lifeExp']]
y creamos una variable con el resultado de la tabla dinamica:
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , columns='country')
y mostramos el resultado de esa tabla dinamica:
print(tabla)
El resultado seria:
country
Afghanistan 37.478833
Albania 68.432917
Algeria 59.030167
Angola 37.883500
Argentina 69.060417
Australia 74.662917
Austria 73.103250
Bahrain 65.605667
Bangladesh 49.834083
Belgium 73.641750
Benin 48.779917
Bolivia 52.504583
Bosnia and Herzegovina 67.707833
Botswana 54.597500
Brazil 62.239500
Bulgaria 69.743750
Burkina Faso 44.694000
........
3) esperanza de vida media por año y continente
subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent')
print(tabla)
El resultado:
4) esperanza de vida por año, continente, y agregando funcion minima y maxima
subdatos=datos[['continent','year','lifeExp']]
tabla=pd.pivot_table(subdatos , values = 'lifeExp' , index=['year'], columns='continent', aggfunc = [min,max])
print(tabla)
El resultado por pantalla seria:
min max \
continent Africa Americas Asia Europe Oceania Africa Americas Asia
year
1952 30.000 37.579 28.801 43.585 69.120 52.724 68.750 65.390
1957 31.570 40.696 30.332 48.079 70.260 58.089 69.960 67.840
1962 32.767 43.428 31.997 52.098 70.930 60.246 71.300 69.390
1967 34.113 45.032 34.020 54.336 71.100 61.557 72.130 71.430
1972 35.400 46.714 36.088 57.005 71.890 64.274 72.880 73.420
1977 36.788 49.923 31.220 59.507 72.220 67.064 74.210 75.380
1982 38.445 51.461 39.854 61.036 73.840 69.885 75.760 77.110
1987 39.906 53.636 40.822 63.108 74.320 71.913 76.860 78.670
1992 23.599 55.089 41.674 66.146 76.330 73.615 77.950 79.360
1997 36.087 56.671 41.763 68.835 77.550 74.772 78.610 80.690
2002 39.193 58.137 42.129 70.845 79.110 75.744 79.770 82.000
2007 39.613 60.916 43.828 71.777 80.204 76.442 80.653 82.603
continent Europe Oceania
year
1952 72.670 69.390
1957 73.470 70.330
1962 73.680 71.240
1967 74.160 71.520
1972 74.720 71.930
1977 76.110 73.490
1982 76.990 74.740
1987 77.410 76.320
1992 78.770 77.560
1997 79.390 78.830
2002 80.620 80.370
2007 81.757 81.235
'Nota:
Los datos al ser muchas columnas, y sobrepasar el ancho de pantalla los divide al mostrarlo.
Código completo del ejemplo: alojado en google drive
Fuente Original:
http://cmdlinetips.com/2018/12/pivot-table-in-python-pandas/
Otra pagina interesante:
https://www.analyticslane.com/2018/11/23/tablas-dinamicas-en-python-con-pandas/