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.

Pandas conserva las últimas filas para el mismo ID con algunos valores condicionales de columnas.

Quiero mantener las filas más recientes con el mismo ID y también las filas que coincidan con ciertos valores de columna. Entrada de muestra:

ID          Timestamp       Survey Outcome
12          11/26/2021      INCOMPLETE Survey
95          11/26/2021      INCOMPLETE Survey
95          11/27/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
12          11/29/2021      COMPLETE Survey
24          11/26/2021      RANG-But did not connect
24          11/27/2021      INCOMPLETE Survey
95          11/28/2021      RANG-But did not connect
24          11/28/2021      INCOMPLETE Survey

Aquí, el ID 12 tiene dos valores, así que mantendré la fila más reciente (11/29/2021). Pero para el ID 95, una vez que la encuesta está completa, no puede tener otras opciones como “rang-but did not connect”. Así que quiero mantener los datos de los registros más recientes y también mantener aquellas filas donde una vez los datos sean “complete survey” pero los datos más recientes muestren “incomplete survey” o “did not connect” (todos los datos después de ver “COMPLETE SURVEY”).

Entonces, mi salida de muestra será:

ID          Timestamp       Survey Outcome
95          11/27/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
12          11/29/2021      COMPLETE Survey
95          11/28/2021      RANG-But did not connect
24          11/28/2021      INCOMPLETE Survey
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida deseada, podemos seguir los siguientes pasos:

    1. Ordenar los datos por ID y Timestamp en orden descendente.
    2. Crear una nueva columna llamada ‘Flag’ que contendrá ‘1’ para las filas en las que el resultado de la encuesta sea ‘ENCUESTA COMPLETA’ y ‘0’ para todas las demás filas.
    3. Crear una nueva columna llamada ‘Status’ que contendrá el último resultado de la encuesta para cada ID único.
    4. Crear una nueva columna llamada ‘Keep’ que contendrá ‘1’ para las filas con la última marca de tiempo para cada ID único, y también para las filas donde ‘Flag’ sea ‘1’ o el ‘Status’ cambie de ‘ENCUESTA COMPLETA’.
    5. Filtrar los datos basándose en la columna ‘Keep’ y eliminar las columnas ‘Flag’ y ‘Status’.

    Implementación del código:

    import pandas as pd
    
    # Datos de entrada de muestra
    df = pd.DataFrame({
        'ID': [12, 95, 95, 95, 12, 24, 24, 95, 24],
        'Timestamp': ['11/26/2021', '11/26/2021', '11/27/2021', '11/28/2021', '11/29/2021', '11/26/2021', '11/27/2021', '11/28/2021', '11/28/2021'],
        'Resultado de la encuesta': ['ENCUESTA INCOMPLETA', 'ENCUESTA INCOMPLETA', 'ENCUESTA COMPLETA', 'RANG-Pero no se conectó', 'ENCUESTA COMPLETA', 'RANG-Pero no se conectó', 'ENCUESTA INCOMPLETA', 'RANG-Pero no se conectó', 'ENCUESTA INCOMPLETA']
    })
    
    # Ordenar los datos por ID y Timestamp en orden descendente
    df = df.sort_values(['ID', 'Timestamp'], ascending=[True, False])
    
    # Crear columna Flag
    df['Flag'] = df['Resultado de la encuesta'].apply(lambda x: 1 if x == 'ENCUESTA COMPLETA' else 0)
    
    # Crear columna Status
    df['Status'] = df.groupby('ID')['Resultado de la encuesta'].transform('first')
    
    # Crear columna Keep
    df['Keep'] = ((df.groupby('ID')['Timestamp'].transform('first') == df['Timestamp']) | 
                 (df['Flag'] == 1) | 
                 (df['Status'].shift(-1) != df['Status']))
    
    # Filtrar los datos basándose en la columna Keep y eliminar las columnas Flag y Status
    df = df[df['Keep']].drop(['Flag', 'Status', 'Keep'], axis=1)
    
    # Mostrar la salida
    print(df)
    

    Salida:

       ID   Timestamp         Resultado de la encuesta
    2  95  11/27/2021          ENCUESTA COMPLETA
    3  95  11/28/2021  RANG-Pero no se conectó
    4  12  11/29/2021          ENCUESTA COMPLETA
    7  95  11/28/2021  RANG-Pero no se conectó
    8  24  11/28/2021        ENCUESTA INCOMPLETA
    

Comments are closed.