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: Nueva columna con valores mayores a 0 y operar con estos valores.

Tengo un dataframe grande con más de 2500 columnas, pero la estructura es muy similar a esta:

      A     B     C     D      E
0     1     0     8     0      0
1     0     0     0     0      5
2     1     2     3     0      0
3     0     2     0     1      0

Necesito detectar todas las columnas con un valor mayor que 0 y lo he hecho de la siguiente manera:

df['X'] = df.gt(0).dot(df.columns + ',')

Y luego obtengo esto:

      A     B     C     D      E    X
0     1     0     8     0      0    A,C
1     0     0     0     0      5    E
2     1     2     9     0      0    A,B,C
3     0     3     0     1      0    B,D

El problema es que no necesito en ‘X’ el nombre de las columnas, sino el valor de las columnas y necesito realizar la siguiente operación matemática:

Quiero que solo detecte los 2 valores más bajos y reste el valor más bajo del segundo más bajo. En caso de que solo haya 2 valores en ‘X’, sería suficiente para mí mostrar solo el valor de la columna.

El resultado final en mi ejemplo sería el siguiente:

      A     B     C     D      E    X
0     1     0     8     0      0    7
1     0     0     0     0      5    5
2     1     2     9     0      0    1
3     0     3     0     1      0    2

¿Alguna idea de cómo resolverlo o alguna orientación?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puedes modificar el código existente para encontrar los dos valores no nulos más bajos en cada fila y luego restarlos para obtener el resultado deseado. Aquí hay una manera de hacerlo:

    # Encuentra los dos valores no nulos más bajos en cada fila
    df['X'] = df[df.gt(0)].apply(lambda x: x.nsmallest(2).values, axis=1)
    
    # Resta el valor más bajo del segundo valor más bajo
    df['X'] = df['X'].apply(lambda x: x[1]-x[0] if len(x)==2 else x[0])
    
    # Cambia el nombre de la columna a X
    df = df.rename(columns={'X': 'X_new'})
    
    # Elimina la columna X original
    df = df.drop(columns=['X'])
    

    La primera línea de código encuentra los dos valores no nulos más bajos en cada fila usando df[df.gt(0)] para filtrar los valores cero y apply con una función lambda para aplicar el método nsmallest a cada fila.

    La segunda línea resta el valor más bajo del segundo valor más bajo usando otro apply con una función lambda que verifica la longitud del arreglo (ya que algunas filas pueden tener solo un valor no nulo) y realiza la resta si hay dos valores, o devuelve el valor único si solo hay uno.

    La tercera línea cambia el nombre de la columna a ‘X_new’ para evitar sobrescribir la columna ‘X’ original.

    La cuarta línea elimina la columna ‘X’ original usando drop.

    Después de ejecutar este código, el dataframe resultante tendrá los valores deseados en una nueva columna llamada ‘X_new’.

Comments are closed.