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
?
Ответы
Ответ 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'])