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?
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 apliquemyfunc()
a cada fila. Aquí hay un ejemplo: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 aplicamyfunc()
a ella, pasandodf
como argumentoX
y el índice de fila como argumentoY
. Finalmente, el resultado se asigna a una nueva columna llamadalast_non_zero_col
endf
.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 onumba
(compilación JIT) pueden ser más adecuados.