Tengo el siguiente marco de datos:
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 manera más eficiente de hacer esto?
Compilé y ejecuté mi código. Este es un código exacto. Puedes probarlo tú mismo.
data = pd.read_excel('file.xlsx')
Si tiene algún carácter especial o espacio en el nombre de la columna, puede escribirlo en ''
como en el código dado:
data = data[data['expire/t'].notnull()] print (date)
Si solo hay un nombre de columna de una sola cadena sin ningún espacio o carácter especial, puede acceder directamente a él.
data = data[data.expire ! = 0] print (date)
Usé lo siguiente para filtrar los valores dados en una columna:
def filter_rows_by_values(df, col, values): return df[~df[col].isin(values)]
Ejemplo:
En un DataFrame, quiero eliminar filas que tienen valores "b" y "c" en la columna "str"
df = pd.DataFrame({"str": ["a","a","a","a","b","b","c"], "other": [1,2,3,4,5,6,7]}) df str other 0 a 1 1 a 2 2 a 3 3 a 4 4 b 5 5 b 6 6 c 7 filter_rows_by_values(df, "str", ["b","c"]) str other 0 a 1 1 a 2 2 a 3 3 a 4
Agregando una forma más de hacer esto.
df = df.query("line_race!=0")
Una de las formas más eficientes y pandaicas es usar el método eq()
:
df[~df.line_race.eq(0)]
En caso de que necesite eliminar la fila, pero el valor puede estar en diferentes columnas. En mi caso, estaba usando porcentajes, así que quería eliminar las filas que tienen un valor de 1 en cualquier columna, ya que eso significa que es el 100%
for x in df: df.drop(df.loc[df[x]==1].index, inplace=True)
No es óptimo si su df tiene demasiadas columnas.
Aunque la respuesta anterior es casi similar a lo que voy a hacer, pero usar el método index no requiere usar otro método de indexación .loc(). Se puede hacer de una manera similar pero precisa como
df.drop(df.index[df['line_race'] == 0], inplace = True)
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 sigue siendo una forma alternativa de hacer lo mismo.
df = df.drop(df[df['line_race']==0].index)
Si desea eliminar filas en función de varios valores de la columna, puede usar:
df[(df.line_race != 0) & (df.line_race != 10)]
Para eliminar todas las filas con valores 0 y 10 para line_race
.
Simplemente agregando otra forma para que DataFrame se expanda en todas las columnas:
for column in df.columns: df = df[df[column]!=0]
Ejemplo:
def z_score(data,count): threshold=3 for column in data.columns: mean = np.mean(data[column]) std = np.std(data[column]) for i in data[column]: zscore = (i-mean)/std if(np.abs(zscore)>threshold): count=count+1 data = data[data[column]!=i] return data,count
Sin embargo, la respuesta dada es correcta, ya que alguien dijo que puede usar df.query('line_race != 0')
que, dependiendo de su problema, es mucho más rápido. Altamente recomendado.
Pero para futuros transgresores, podría mencionar que df = df[df.line_race != 0]
no hace nada cuando intenta filtrar por None
/valores faltantes.
Funciona:
df = df[df.line_race != 0]
no hace nada:
df = df[df.line_race != None]
Funciona:
df = df[df.line_race.notnull()]
Si estoy entendiendo correctamente, debería ser tan simple como:
df = df[df.line_race != 0]
La mejor manera de hacer esto es con un 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á disponible, otra forma de hacerlo es df.query('line_race != 0')
.