web-dev-qa-db-fra.com

pandas équivalent de np.where

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?

33
max

Essayer:

(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])

La différence entre le numpywhere et le DataFramewhere 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 numpywhereordre des arguments ):

pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
29
Alex