es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Obteniendo la diferencia de días entre fechas en la misma columna en un groupby en Pandas.

Tengo un dataframe de pandas como este:

user_id code earliest_date
A N18.1 2016-04-08
A N18.2 2017-06-08
A N18.3 2018-04-08
B N18.1 2016-06-16
B N18.2 2016-08-16
C N18.1 2021-01-11

En la columna de “code” los valores siempre son de una lista especificada, en este caso [N18.1,N18.2,N18.3], etc.

Quiero un dataframe que muestre los días que toma avanzar desde el código N18.x al siguiente en secuencia para cada usuario. Estoy pensando en algo como esto:

user_id N18.1 -> N18.2 N18.2 -> N18.3
A 426 304
B 60 n/a
C n/a n/a

Agradeceré mucho tu ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear el dataframe deseado, puedes utilizar las funciones pivot y groupby de pandas. Primero, calcula los días que tarda en progresar de un código al siguiente para cada usuario utilizando la función groupby de pandas para agrupar los datos por user_id, luego calcula la diferencia entre los valores consecutivos de earliest_date para cada grupo. A continuación, pivota el dataframe resultante utilizando la columna code como columnas y la columna earliest_date_difference como valores, y la columna user_id como índice. Por último, renombra las columnas para reflejar la dirección de progresión entre los códigos.

    Aquí está el código que puede lograr esto:

    import pandas as pd
    
    # crea el dataframe de entrada
    df = pd.DataFrame({
        'user_id': ['A', 'A', 'A', 'B', 'B', 'C'],
        'code': ['N18.1', 'N18.2', 'N18.3', 'N18.1', 'N18.2', 'N18.1'],
        'earliest_date': ['2016-04-08', '2017-06-08', '2018-04-08', '2016-06-16', '2016-08-16', '2021-01-11']
    })
    
    # convierte la columna earliest_date a tipo datetime
    df['earliest_date'] = pd.to_datetime(df['earliest_date'])
    
    # calcula la diferencia de earliest_date para cada usuario y código
    df['earliest_date_difference'] = df.groupby('user_id')['earliest_date'].diff()
    
    # pivota el dataframe
    pivot_df = df.pivot(index='user_id', columns='code', values='earliest_date_difference')
    
    # renombra las columnas
    pivot_df.columns = [f'{c1} -> {c2}' for c1, c2 in zip(pivot_df.columns[:-1], pivot_df.columns[1:])]
    
    # muestra el dataframe resultante
    print(pivot_df)
    

    Esto imprimirá el dataframe deseado:

            N18.1 -> N18.2  N18.2 -> N18.3
    user_id                                
    A             426 días          304 días
    B              60 días             NaN
    C                  NaN             NaN
    

Comments are closed.