Lambda incluyendo if … elif … else

Quiero aplicar una función lambda a una columna DataFrame usando if … elif … else dentro de la función lambda.

El df y el código son algo. me gusta:

df=pd.DataFrame({"one":[1,2,3,4,5],"two":[6,7,8,9,10]}) df["one"].apply(lambda x: x*10 if x<2 elif x<4 x**2 else x+10) 

Obviamente de esta manera no está funcionando. ¿Hay una manera de aplicar si …. elif …. else a lambda? ¿Cómo puedo aprovechar el mismo resultado con List Comprehension?

Gracias por cualquier respuesta.

Anidar if .. else s:

 lambda x: x*10 if x<2 else (x**2 if x<4 else x+10) 

No recomiendo el uso de apply aquí, debe evitarse si hay mejores alternativas.

Por ejemplo, si está realizando la siguiente operación en una serie:

 if cond1: exp1 elif cond2: exp2 else: exp3 

Este suele ser un buen caso de uso para np.where o np.select .


np.where

La cadena if else puede ser escrita usando

 np.where(cond1, exp1, np.where(cond2, exp2, ...)) 

np.where permite anidar. Con un nivel de anidamiento, su problema se puede resolver con,

 df['three'] = ( np.where( df['one'] < 2, df['one'] * 10, np.where(df['one'] < 4, df['one'] ** 2, df['one'] + 10)) df one two three 0 1 6 10 1 2 7 4 2 3 8 9 3 4 9 14 4 5 10 15 

np.select

Permite una syntax flexible y es fácilmente extensible. Sigue la forma,

 np.select([cond1, cond2, ...], [exp1, exp2, ...]) 

O, en este caso,

 np.select([cond1, cond2], [exp1, exp2], default=exp3) 

 df['three'] = ( np.select( condlist=[df['one'] < 2, df['one'] < 4], choicelist=[df['one'] * 10, df['one'] ** 2], default=df['one'] + 10)) df one two three 0 1 6 10 1 2 7 4 2 3 8 9 3 4 9 14 4 5 10 15 

and / or lugar de if / else

Similar a if-else , requiere la lambda :

 df['three'] = df["one"].apply( lambda x: (x < 2 and x * 10) or (x < 4 and x ** 2) or x + 10) df one two three 0 1 6 10 1 2 7 4 2 3 8 9 3 4 9 14 4 5 10 15 

Comprensión de lista

Solución loca que es aún más rápida de apply .

 df['three'] = [x*10 if x<2 else (x**2 if x<4 else x+10) for x in df['one']] # df['three'] = [ # (x < 2 and x * 10) or (x < 4 and x ** 2) or x + 10) for x in df['one'] # ] df one two three 0 1 6 10 1 2 7 4 2 3 8 9 3 4 9 14 4 5 10 15