Подтвердить что ты не робот

Pandas эквивалент np.where

np.where имеет семантику векторизованного if/else (аналогично методу Apache Spark when/otherwise DataFrame). Я знаю, что я могу использовать np.where в pandas Series, но pandas часто определяет свой собственный API для использования вместо raw numpy функций, что обычно более удобно с pd.Series/pd.DataFrame.

Конечно, я нашел pandas.DataFrame.where. Однако, на первый взгляд, он имеет совершенно другую семантику. Я не мог найти способ переписать наиболее простой пример np.where с помощью 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'])

Я пропустил что-то очевидное? Или pandas where предназначен для совершенно другого варианта использования, несмотря на то же имя, что и np.where?

4b9b3361

Ответ 1

Try:

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

Разница между numpy where и DataFrame where заключается в том, что значения по умолчанию предоставляются DataFrame, на которые вызывается метод where (docs).

т.е.

np.where(m, A, B)

примерно эквивалентен

A.where(m, B)

Если вам нужна аналогичная сигнатура вызова с использованием pandas, вы можете использовать способ вызова методов в Python:

pd.DataFrame.where(cond=(df['A'] < 0) | (df['B'] > 0), self=df['A'] + df['B'], other=df['A'] / df['B'])

или без kwargs (Обратите внимание: что порядок позиций аргументов отличается от порядка numpy where):

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