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.

Cómo aplicar la siguiente regla a mi dataframe pandas

Mi dataframe =

df = pd.DataFrame({'class': 'a a b b b c c c'.split(),
                   'code': ['103','104','103','103','104','104','104','103'],
                   'qty': [4,4,5,6,11,8,9,0]})

Quiero para cada clase si hay un código 103 y 104 y si la cantidad asociada al código 103 es mayor que la cantidad del código 104.

He desarrollado una función para la primera parte del problema que no funciona, pero no sé cómo hacer la segunda.

def regle_2(df):
    if (df['code'].any() == '103') and (df['code'].any() == '104'):
        df['bool'] = True
    else:
        df['bool'] = False
    return df

Y lo uso así:

g = df.groupby('class').apply(regle_2)

y este es el resultado:

  class code  qty   bool
0     a  103    4  False
1     a  104    4  False
2     b  103    5  False
3     b  103    6  False
4     b  104   11  False
5     c  104    8  False
6     c  104    9  False
7     c  103    0  False

Gracias de antemano por tu consejo.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para resolver la segunda parte del problema, puede modificar su función actual para verificar si se cumple la condición para cada grupo. Aquí hay una versión modificada de su función:

    def regle_2(df):
        if ('103' in df['code'].values) and ('104' in df['code'].values):
            qty_103 = df.loc[df['code'] == '103', 'qty'].sum()
            qty_104 = df.loc[df['code'] == '104', 'qty'].sum()
            df['bool'] = qty_103 > qty_104
        else:
            df['bool'] = False
        return df
    

    Esta función primero verifica si tanto los códigos ‘103’ como ‘104’ están presentes en el grupo. Si lo están, calcula la suma de cantidades para cada código utilizando los métodos loc y sum. Luego, compara estas sumas para verificar si la cantidad para ‘103’ es mayor que la de ‘104’. Finalmente, devuelve el dataframe modificado con una columna adicional llamada ‘bool’.

    Puede aplicar esta función a cada grupo usando groupby como antes:

    g = df.groupby('class').apply(regle_2)
    

    Esto debería proporcionarle el resultado deseado:

      class code  qty   bool
    0     a  103    4  False
    1     a  104    4  False
    2     b  103    5   True
    3     b  103    6   True
    4     b  104   11   True
    5     c  104    8   True
    6     c  104    9   True
    7     c  103    0  False
    

Comments are closed.