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: ¿Cómo eliminar/filtrar valores Null/Na?

¿Cómo puedo lograr lo siguiente? Quiero eliminar filas (agrupadas por id) si al menos hay un valor NULL en la columna inv.

    id  inv   name
0    1  1AB   None
1    1  2CD   Raul
2    1  5DR   Elena
3    2  None  Jose
4    2  None  Ramon
5    2  4RD   Jessi
6    3  3GT    None
7    3  5GR   Alvaro
8    3  6CF   Marge
9    3  45YU   Jim

El resultado que busco debería ser así:

    id  inv   name
0    1  1AB   None
1    1  2CD   Raul
2    1  5DR   Elena
6    3  3GT    None
7    3  5GR   Alvaro
8    3  6CF   Marge
9    3  45YU   Jim
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar filas agrupadas por id si hay al menos un valor NULL en la columna inv, se puede utilizar la función groupby() en pandas junto con los métodos apply() y any() para verificar si algún valor en la columna inv es nulo para cada grupo. Aquí está el código para lograr el resultado deseado:

    import pandas as pd
    
    # crear el dataframe original
    df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 2, 3, 3, 3, 3],
                       'inv': ['1AB', '2CD', '5DR', None, None, '4RD', '3GT', '5GR', '6CF', '45YU'],
                       'name': [None, 'Raul', 'Elena', 'Jose', 'Ramon', 'Jessi', None, 'Alvaro', 'Marge', 'Jim']})
    
    # agrupar por 'id' y filtrar los grupos donde algún valor en 'inv' es nulo
    mask = df.groupby('id')['inv'].apply(lambda x: x.isnull().any())
    df = df[~df['id'].isin(mask[mask].index)]
    
    print(df)
    

    Salida:

       id  inv   name
    0   1  1AB   None
    1   1  2CD   Raul
    2   1  5DR  Elena
    6   3  3GT   None
    7   3  5GR  Alvaro
    8   3  6CF  Marge
    9   3  45YU   Jim
    

    La función apply() se utiliza para aplicar una función que verifica si algún valor en la columna inv es nulo para cada grupo. La función any() devuelve True si al menos un valor es True en la matriz booleana devuelta por isnull(), lo cual indica la presencia de un valor nulo.

    La matriz booleana resultante está indexada por los valores de id, por lo que al usar mask[mask] se obtiene un subconjunto de la matriz que solo contiene valores True, que corresponden a los grupos que tienen valores nulos en la columna inv. La propiedad index se utiliza para obtener una lista de los valores de id para estos grupos, que luego se utilizan para crear una máscara booleana para filtrar las filas que pertenecen a estos grupos.

Comments are closed.