Eliminar fila de DataFrame en Pandas basado en valor de columna

Tengo el siguiente DataFrame:

daysago line_race rating rw wrating line_date 2007-03-31 62 11 56 1.000000 56.000000 2007-03-10 83 11 67 1.000000 67.000000 2007-02-10 111 9 66 1.000000 66.000000 2007-01-13 139 10 83 0.880678 73.096278 2006-12-23 160 10 88 0.793033 69.786942 2006-11-09 204 9 52 0.636655 33.106077 2006-10-22 222 8 66 0.581946 38.408408 2006-09-29 245 9 70 0.518825 36.317752 2006-09-16 258 11 68 0.486226 33.063381 2006-08-30 275 8 72 0.446667 32.160051 2006-02-11 475 5 65 0.164591 10.698423 2006-01-13 504 0 70 0.142409 9.968634 2006-01-02 515 0 64 0.134800 8.627219 2005-12-06 542 0 70 0.117803 8.246238 2005-11-29 549 0 70 0.113758 7.963072 2005-11-22 556 0 -1 0.109852 -0.109852 2005-11-01 577 0 -1 0.098919 -0.098919 2005-10-20 589 0 -1 0.093168 -0.093168 2005-09-27 612 0 -1 0.083063 -0.083063 2005-09-07 632 0 -1 0.075171 -0.075171 2005-06-12 719 0 69 0.048690 3.359623 2005-05-29 733 0 -1 0.045404 -0.045404 2005-05-02 760 0 -1 0.039679 -0.039679 2005-04-02 790 0 -1 0.034160 -0.034160 2005-03-13 810 0 -1 0.030915 -0.030915 2004-11-09 934 0 -1 0.016647 -0.016647 

Necesito eliminar las filas donde line_race es igual a 0 . ¿Cuál es la forma más eficiente de hacer esto?

Si estoy entendiendo correctamente, debería ser tan simple como:

 df = df[df.line_race != 0] 

Pero para los futuros usuarios de bypass, puede mencionar que df = df[df.line_race != 0] no hace nada cuando intenta filtrar por None / valores perdidos.

Funciona:

 df = df[df.line_race != 0] 

No hace nada:

 df = df[df.line_race != None] 

Funciona:

 df = df[df.line_race.notnull()] 

La mejor manera de hacerlo es con el enmascaramiento booleano:

 In [56]: df Out[56]: line_date daysago line_race rating raw wrating 0 2007-03-31 62 11 56 1.000 56.000 1 2007-03-10 83 11 67 1.000 67.000 2 2007-02-10 111 9 66 1.000 66.000 3 2007-01-13 139 10 83 0.881 73.096 4 2006-12-23 160 10 88 0.793 69.787 5 2006-11-09 204 9 52 0.637 33.106 6 2006-10-22 222 8 66 0.582 38.408 7 2006-09-29 245 9 70 0.519 36.318 8 2006-09-16 258 11 68 0.486 33.063 9 2006-08-30 275 8 72 0.447 32.160 10 2006-02-11 475 5 65 0.165 10.698 11 2006-01-13 504 0 70 0.142 9.969 12 2006-01-02 515 0 64 0.135 8.627 13 2005-12-06 542 0 70 0.118 8.246 14 2005-11-29 549 0 70 0.114 7.963 15 2005-11-22 556 0 -1 0.110 -0.110 16 2005-11-01 577 0 -1 0.099 -0.099 17 2005-10-20 589 0 -1 0.093 -0.093 18 2005-09-27 612 0 -1 0.083 -0.083 19 2005-09-07 632 0 -1 0.075 -0.075 20 2005-06-12 719 0 69 0.049 3.360 21 2005-05-29 733 0 -1 0.045 -0.045 22 2005-05-02 760 0 -1 0.040 -0.040 23 2005-04-02 790 0 -1 0.034 -0.034 24 2005-03-13 810 0 -1 0.031 -0.031 25 2004-11-09 934 0 -1 0.017 -0.017 In [57]: df[df.line_race != 0] Out[57]: line_date daysago line_race rating raw wrating 0 2007-03-31 62 11 56 1.000 56.000 1 2007-03-10 83 11 67 1.000 67.000 2 2007-02-10 111 9 66 1.000 66.000 3 2007-01-13 139 10 83 0.881 73.096 4 2006-12-23 160 10 88 0.793 69.787 5 2006-11-09 204 9 52 0.637 33.106 6 2006-10-22 222 8 66 0.582 38.408 7 2006-09-29 245 9 70 0.519 36.318 8 2006-09-16 258 11 68 0.486 33.063 9 2006-08-30 275 8 72 0.447 32.160 10 2006-02-11 475 5 65 0.165 10.698 

ACTUALIZACIÓN: Ahora que pandas 0.13 está fuera, otra forma de hacerlo es df.query('line_race != 0') .

La respuesta dada es correcta, sin embargo, como alguien de arriba dijo que puedes usar df.query('line_race != 0') que dependiendo de tu problema es mucho más rápido. Altamente recomendado.

solo para agregar otra solución, particularmente útil si está utilizando los nuevos asesores de pandas, otras soluciones reemplazarán a los pandas originales y perderán a los asesores

 df.drop(df.loc[df['line_race']==0].index, inplace=True) 

Otra forma de hacerlo. Puede que no sea la forma más eficiente, ya que el código parece un poco más complejo que el código mencionado en otras respuestas, pero es una forma alternativa de hacer lo mismo.

  df = df.drop(df[df['line_race']==0].index) 

Aunque la respuesta anterior es casi similar a lo que voy a hacer, pero usar el método de índice no requiere usar otro método de indexación .loc (). Se puede hacer de manera similar pero precisa como

 df.drop(df.index[df['line_race'] == 0], inplace = True)