np.where
a la sémantique d'un if/else vectorisé (semblable à la méthode when
/otherwise
de DataFrame d'Apache Spark). Je sais que je peux utiliser np.where
on pandas Series
, mais pandas
définit souvent sa propre API à utiliser à la place des fonctions raw numpy
, ce qui est généralement plus pratique avec pd.Series
/pd.DataFrame
.
Effectivement, j'ai trouvé pandas.DataFrame.where
. Cependant, à première vue, sa sémantique est complètement différente. Je n'ai pas trouvé le moyen de réécrire l'exemple le plus simple de np.where
using pandas where
:
# df is pd.DataFrame
# how to write this using df.where?
df['C'] = np.where((df['A']<0) | (df['B']>0), df['A']+df['B'], df['A']/df['B'])
Est-ce que je manque quelque chose d'évident? Ou est pandas where
destiné à un cas d'utilisation complètement différent, malgré le même nom que np.where
?
Essayer:
(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
La différence entre le numpy
where
et le DataFrame
where
est que les valeurs par défaut sont fournies par le DataFrame
que le where
la méthode est appelée ( docs ).
C'est à dire.
np.where(m, A, B)
est à peu près équivalent à
A.where(m, B)
Si vous voulez une signature d'appel similaire avec des pandas, vous pouvez tirer parti de la façon dont les appels de méthode fonctionnent en Python :
pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])
ou sans kwargs (Remarque: l'ordre de position des arguments est différent de numpy
where
ordre des arguments ):
pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])