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''])