python numpy pandas

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