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?
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:
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 yapply
con una funciónlambda
para aplicar el métodonsmallest
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ónlambda
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’.