95 votes

Lambda y compris si ... elif ... else

Je souhaite appliquer une fonction lambda à une colonne DataFrame en utilisant if ... elif ... else dans la fonction lambda.

Le df et le code sont qch comme:

 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)
 

évidemment de cette façon cela ne fonctionne pas. Existe-t-il un moyen de postuler si .... elif .... sinon de lambda? Comment puis-je reproduire le même résultat avec List Comprehension?

Merci pour toute réponse.

177voto

Uriel Points 10724

Nid if .. else s:

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

44voto

coldspeed Points 111053

Je ne recommande pas l'utilisation de apply ici -, il devrait être évité s'il existe de meilleures alternatives.

Par exemple, si vous effectuez l'opération suivante sur une Série:

if cond1:
    exp1
elif cond2:
    exp2
else:
    exp3

C'est généralement un bon cas d'utilisation de np.where ou np.select.


np.where

L' if else chaîne ci-dessus peuvent être écrites à l'aide de

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

np.where permet de nidification. Avec un niveau d'imbrication, votre problème peut être résolu avec,

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

Permet flexible de la syntaxe et est facilement extensible. Il suit la forme,

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

Ou, dans ce cas,

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 au lieu de if/else

Semblable à l' if-else, nécessite l' 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

Compréhension De Liste

Loopy solution qui est encore plus rapide que l' 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X