Novedades en pandas 0.25

Publicado el 02 septiembre 2019 por Daniel Rodríguez @analyticslane

El pasado 18 de julio de 2019 ha sido publicada la versión 0.25 de pandas. En esta entrada vamos a ver algunas de las novedades que trae esta versión.

Actualización de pandas a la versión 0.25

Antes de ver las novedades de pandas 0.25 es necesario comprobar que tenemos esta versión instalada en nuestro sistema. Para ellos se puede ejecutar el Python las siguientes líneas de código para obtener la versión.

import pandas as pd

pd.__version__

Si esta no es 0.25 o posterior se puede actualizar mediante conda escribiendo la siguiente línea en el terminal y siguiendo las instrucciones que aparecen en pantalla.

conda update pandas

Alternativamente también es posible actualizar la versión de pandas con pip. Lo que se puede hacer escribiendo la siguiente línea en la terminal.

pip install pandas==0.25

Novedades en pandas 0.25

Agregación por nombre

Una de las características mas llamativas de pandas 0.25 es la agregación por nombre ("named aggregation") del groupby(). Lo que permite realizar múltiples operaciones sobre un DataFrame y asignar un nombre a las columnas del objeto resultante. Por ejemplo, en el caso de tener un listado de facturas se puede calcular cual es el máximo y el mínimo de unidades de productos en cada una. Lo que se obtiene mediante el siguiente código.

invoices = {'invoice': [1, 2, 3, 4, 5, 6],
            'client': [2, 1, 3, 1, 2, 3],
            'units': [3, 2, 2, 3, 1, 1],
            'price': [27.76, 21.13, 29.82, 29.96, 21.11, 23.97],
            'total': [83.28, 42.26, 29.82, 59.92, 21.11, 23.97]}
invoices = pd.DataFrame(invoices)

invoices.groupby('client').agg(
    minimum_units = pd.NamedAgg(column='units', aggfunc='min'),
    maximum_units = pd.NamedAgg(column='units', aggfunc='max'))
        minimum_units  maximum_units
client                              
1                   2              3
2                   1              3
3                   1              2

En esta ocasión se realiza una agrupación de los datos por cliente. Obteniéndose para cada uno de clientes el valor mínimo de unidades y el valor máximo de todas sus facturas. Para ello, en primer lugar, se indica la columna de agregación y posteriormente las columnas y la operación que se realiza sobre ellas.

Dado que esta funcionalidad va a ser habitual se puede reemplazar el método pd.NamedAgg() por una tupla con la columna y la función. Permitiendo escribir la operación de una forma más compacta.

invoices.groupby('client').agg(
    minimum_units = pd.NamedAgg(column='units', aggfunc='min'),
    maximum_units = pd.NamedAgg(column='units', aggfunc='max'))

Obteniéndose así el mismo resultado que anteriormente.

Conversión de listas en columnas con explode()

Otra nueva funcionalidad de pandas 0.25 es la posibilidad de transformar las listas de las columnas de un DataFrame en columnas. Una funcionalidad a la que se accede mediante el método explode(). Por ejemplo, si se dispone de un DataFrame con los identificadores de los clientes en una columna y en otra una lista con los identificadores de las facturas se puede crear un nuevo DataFrame con un registro por cada una de las facturas. Así, si se crea el DataFrame

df = [{'invoices': [1, 2, 3], 'client' : 1},
      {'invoices': [4, 6], 'client' : 2}]
df = pd.DataFrame(df)
    invoices  client
0  [1, 2, 3]       1
1     [4, 6]       2

Es posible transformar las listas en registros mediante el método explode().

df.explode('invoices')
  invoices  client
0        1       1
0        2       1
0        3       1
1        4       2
1        6       2

Algo que se complemente bien con lo la expansión de listas de valores publicado anteriormente.

Mejora en la visualización de la estructura de datos MultiIndex

Para aquellos que usamos la estructura de datos MultiIndex la visualización de los datos no era precisamente intuitiva. Mostrando todos los niveles y códigos mezclados. En pandas 0.25 la visualización se mejora considerablemente al imprimir cada fila como una tupla, pudiendo así visualizar mejor las columnas.

df = pd.MultiIndex.from_product([['client', 'data'], range(3)])
MultiIndex([('client', 0),
            ('client', 1),
            ('client', 2),
            (  'data', 0),
            (  'data', 1),
            (  'data', 2)],
           )

Las clases SparseDataFrame y SparseSeries son deprecadas

Finalmente, en pandas 0.25 también se han deprecado SparseDataFrame y SparseSeries. Por lo que al utilizar estos métodos se obtendrán mensajes de advertencia. En la nueva versión los valores dispersos se pueden indicar directamente en el método DataFrame(). Así para crear una matriz dispersa se tiene que modificar

pd.SparseDataFrame({"data": [0, 1]})

por

pd.DataFrame({"data": pd.SparseArray([0, 1])})

Conclusiones

En esta entrada se han visto algunas de las novedades disponibles en pandas 0.25. Las cuales son importante conocer, especialmente aquellas que han sido deprecadas para modificarlas correctamente.

Imágenes: Pixabay (Nick115)

No te olvides valorar esta entrada

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones de Analytics Lane.

Contenido relacionado