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.

Aplicar la función a todas las filas en el dataframe de pandas (lambda)

Tengo la siguiente función para obtener el nombre de la columna del último valor distinto de cero de una fila:

import pandas as pd

def myfunc(X, Y):
    df = X.iloc[Y]
    counter = len(df)-1
    while counter >= 0:
        if df[counter] == 0:
            counter -= 1
        else:
            break
    return(X.columns[counter])

Usando el siguiente ejemplo de código:

data = {'id': ['1', '2', '3', '4', '5', '6'],
        'name': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'GGG'],
        'A1': [1, 1, 1, 0, 1, 1],
        'B1': [0, 0, 1, 0, 0, 1],
        'C1': [1, 0, 1, 1, 0, 0],
        'A2': [1, 0, 1, 0, 1, 0]}
df = pd.DataFrame(data)
df

myfunc(df, 5) # 'B1'

Me gustaría saber cómo puedo aplicar esta función a todas las filas de un dataframe y colocar los resultados en una nueva columna de df .

Estoy pensando en iterar todas las filas (lo cual probablemente no es el enfoque correcto) o usar lambdas con la función apply. Sin embargo, no he tenido éxito con este último enfoque. ¿Alguna ayuda?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de aplicar esta función a todas las filas de un dataframe y crear una nueva columna con los resultados es utilizando el método apply() junto con una función lambda que aplique myfunc() a cada fila. Aquí hay un ejemplo:

    df['last_non_zero_col'] = df.apply(lambda row: myfunc(df, row.name), axis=1)
    

    En este código, df.apply() aplica una función lambda a cada fila del dataframe (axis=1). La función lambda toma cada fila (row) y aplica myfunc() a ella, pasando df como argumento X y el índice de fila como argumento Y. Finalmente, el resultado se asigna a una nueva columna llamada last_non_zero_col en df.

    Tenga en cuenta que este enfoque puede ser lento para dataframes grandes, ya que aplica la función myfunc() a cada fila una por una. Si el rendimiento es una preocupación, otros enfoques como la vectorización o numba (compilación JIT) pueden ser más adecuados.

Comments are closed.