Alternativas a la incómoda indexación de marcos de datos de Pandas / Python: df_REPEATED ]> 0?

En Pandas / Python, tengo que escribir el nombre del dataframe dos veces cuando condiciono su propia variable:

df_REPEATED[df_REPEATED['var']>0] 

Esto sucede tantas veces que parece irrazonable. 90-99% de los usuarios estarían contentos el 95% del tiempo con algo como:

 df_REPEATED[['var']>0] 

Esta syntax también es necesaria usando .loc[] . ¿Hay alguna alternativa o atajo para escribir esto?

Por otro lado, ¿hay algún caso de uso que no entiendo y en realidad mi educación en Python ha sido muy insuficiente?

No es una respuesta oficial … pero ya me simplificó la vida recientemente:

https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py

No es necesario descargar el repository completo: guardar el archivo y hacerlo

 from where import Where as W 

debería bastar Entonces lo usas así:

 df = pd.DataFrame([[1, 2, True], [3, 4, False], [5, 7, True]], index=range(3), columns=['a', 'b', 'c']) # On specific column: print(df.loc[W['a'] > 2]) print(df.loc[-W['a'] == W['b']]) print(df.loc[~W['c']]) # On entire DataFrame: print(df.loc[W.sum(axis=1) > 3]) print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1]) 

Un ejemplo de uso un poco menos estúpido:

 data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)] 

EDITAR: esta respuesta menciona un enfoque análogo que no requiere componentes externos, lo que resulta en:

 data = (pd.read_csv('ugly_db.csv') .loc[lambda df : ~(df == '$null$').any(axis=1)]) 

y otra posibilidad es usar .apply() , como en

 data = (pd.read_csv('ugly_db.csv') .pipe(lambda df : ~(df == '$null$').any(axis=1))) 

df_REPEATED['var'] > 0 es una matriz booleana. Aparte de su longitud, no tiene conexión con el DataFrame. Podría haber sido el resultado de otra expresión, diga another_df['another_var'] > some_other_value , siempre que las longitudes coincidan. Así que ofrece flexibilidad. Si la syntax fuera como la que sugirió, no podríamos hacerlo. Sin embargo, hay alternativas a lo que estás preguntando. Por ejemplo,

 df_REPEATED.query('var > 0') 

query puede ser muy rápida si el DataFrame es grande y es menos detallado, pero carece de las ventajas de la indexación booleana y usted comienza a tener problemas si la expresión se complica.