Try:
(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
The difference between the numpy where and DataFrame where is that the default values are supplied by the DataFrame that the where method is being called on (docs).
I.e.
np.where(m, A, B)
is roughly equivalent to
A.where(m, B)
If you wanted a similar call signature using pandas, you could take advantage of the way method calls work in Python:
pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])
or without kwargs (Note: that the positional order of arguments is different from the numpy where argument order):
pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
Answer from Alex on Stack OverflowTry:
(df['A'] + df['B']).where((df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
The difference between the numpy where and DataFrame where is that the default values are supplied by the DataFrame that the where method is being called on (docs).
I.e.
np.where(m, A, B)
is roughly equivalent to
A.where(m, B)
If you wanted a similar call signature using pandas, you could take advantage of the way method calls work in Python:
pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])
or without kwargs (Note: that the positional order of arguments is different from the numpy where argument order):
pd.DataFrame.where(df['A'] + df['B'], (df['A'] < 0) | (df['B'] > 0), df['A'] / df['B'])
pandas 2.2 update: Series.case_when
From pandas 2.2.0, the API provides a pandaic alternative to np.where and np.select.
Using case_when:
cond = (df['A'] < 0) | (df['B'] > 0)
df['C'] = (df['A'] / df['B']).case_when([(cond, df['A'] + df['B'])])
# or
df['C'] = 0 # Or pd.NA or any reasonable default.
df['C'] = df['C'].case_when([(cond, df['A'] + df['B']),
(~cond, df['A'] / df['B']),
])
You notice that case_when allows you to provide an arbitrary list of conditions and replacement pairs, so this can generalize to several conditions easily (much like np.select).
Using np.where:
df['C'] = np.where((df['A'] < 0) | (df['B'] > 0), df['A'] + df['B'], df['A'] / df['B'])