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