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.

Reste uno al último valor distinto de cero en la fila; multiplique por la columna.

He creado un dataframe con fechas y la cantidad de días de cada mes a partir de un dataframe de fechas de llegada y salida. Este dataframe puede tener n columnas de longitud.

    2021-01 2021-02 2021-03
0   0       0       4
1   0       2       1
2   0       5       0
3   0       4       4
4   10      2       0

Lo que quiero hacer es seleccionar la última columna con un valor distinto de cero y restarle 1.

Básicamente, se vería así después:

    2021-01 2021-02 2021-03
0   0       0       3
1   0       2       0
2   0       4       0
3   0       4       3
4   10      1       0

He intentado utilizar numpy con:

df2 = df2[np.arange(df2.shape[0]),(df2!=0).cumsum(1).argmax(1)] - 1

Pero esto no parece funcionar correctamente con pandas.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema utilizando pandas, puedes usar la función apply junto con una función lambda que selecciona el último valor distinto de cero en cada fila y le resta 1. Aquí tienes un ejemplo de código para lograr esto:

    # seleccionar solo las columnas con información de fecha
    date_cols = df.columns[:-1]
    
    # aplicar la función lambda a cada fila para restar 1 al último valor distinto de cero
    df[date_cols] = df.apply(lambda x: x.iloc[x.to_numpy().nonzero()[0][-1]] - 1, axis=1)
    

    Este código primero selecciona las columnas con información de fecha (es decir, todas las columnas excepto la última) y luego aplica una función lambda a cada fila utilizando la función apply. La función lambda encuentra el último valor distinto de cero en la fila utilizando to_numpy().nonzero()[0][-1] y luego le resta 1. Finalmente, las columnas de fecha originales en el dataframe se actualizan con los nuevos valores.

    Esto debería darte la salida deseada como se muestra en el segundo dataframe en la pregunta.

Comments are closed.