python - pandas equivalente de np.where
numpy (1)
np.where
tiene la semántica de un vectorizado si / else (similar al método de DataFrame when
/ de otherwise
Apache Spark). Sé que puedo usar np.where
en pandas Series
, pero pandas
menudo define su propia API para usar en lugar de las funciones numpy
bruto, lo que suele ser más conveniente con pd.Series
/ pd.DataFrame
.
Efectivamente, encontré pandas.DataFrame.where
. Sin embargo, a primera vista, tiene una semántica completamente diferente. No pude encontrar una manera de volver a escribir el ejemplo más básico de np.where
utilizando 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''])
¿Me estoy perdiendo algo obvio? ¿O es que los pandas fueron diseñados para un caso de uso completamente diferente, a pesar del mismo nombre que np.where
?
Tratar:
(df[''A''] + df[''B'']).where((df[''A''] < 0) | (df[''B''] > 0), df[''A''] / df[''B''])
La diferencia entre el numpy
where
y el DataFrame
where
es que los valores predeterminados son proporcionados por el DataFrame
que el método where
se llama en ( pandas.pydata.org/pandas-docs/stable/generated/… ).
Es decir
np.where(m, A, B)
es aproximadamente equivalente a
A.where(m, B)
Si desea una firma de llamada similar con pandas, puede aprovechar la forma en que funcionan las llamadas a métodos en Python :
pd.DataFrame.where(cond=(df[''A''] < 0) | (df[''B''] > 0), self=df[''A''] + df[''B''], other=df[''A''] / df[''B''])
o sin kwargs (Nota: que el orden posicional de los argumentos es diferente del numpy
where
orden de los argumentos ):
pd.DataFrame.where(df[''A''] + df[''B''], (df[''A''] < 0) | (df[''B''] > 0), df[''A''] / df[''B''])