Pandas Equivalente de R que ()

Las variaciones de esta pregunta se han preguntado anteriormente, todavía tengo problemas para entender cómo cortar realmente una serie de datos / pandas de python en función de las condiciones que me gustaría establecer.

En R, lo que estoy tratando de hacer es:

df[which(df[,colnumber] > somenumberIchoose),] 

La función which () encuentra índices de entradas de fila en una columna en el dataframe que son mayores que somenumberIchoose, y devuelve esto como un vector. Luego, divido el dataframe utilizando estos índices de fila para indicar qué filas del dataframe me gustaría ver en el nuevo formulario.

¿Hay una manera equivalente de hacer esto en python? He visto referencias para enumerar, que no entiendo completamente después de leer la documentación. Mi muestra con el fin de obtener los índices de fila en este momento se ve así:

 indexfuture = [ x.index(), x in enumerate(df['colname']) if x > yesterday] 

Sin embargo, sigo recibiendo un error de syntax no válido. Puedo hackear una solución alternativa haciendo un bucle a través de los valores y haciendo la búsqueda manualmente yo mismo, pero eso parece extremadamente no pythonico e ineficiente.

¿Qué hace enumerar () exactamente? ¿Cuál es la forma pythonica de encontrar índices de valores en un vector que cumplan con los parámetros deseados?

Nota: estoy usando Pandas para los marcos de datos

Puede que no entienda claramente la pregunta, pero parece que la respuesta es más fácil de lo que piensas:

utilizando pandas DataFrame:

 df['colname'] > somenumberIchoose 

devuelve una serie de pandas con valores verdaderos / falsos y el índice original del dataframe.

Luego, puede usar esa serie booleana en el DataFrame original y obtener el subconjunto que está buscando:

 df[df['colname'] > somenumberIchoose] 

debería ser suficiente.

Consulte http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

Lo que sé de R podría sentirse más cómodo trabajando con numpy , un paquete de computación científica similar a MATLAB.

Si desea los índices de una matriz cuyos valores son divisibles por dos, lo siguiente funcionaría.

 arr = numpy.arange(10) truth_table = arr % 2 == 0 indices = numpy.where(truth_table) values = arr[indices] 

También es fácil trabajar con matrices multidimensionales

 arr2d = arr.reshape(2,5) col_indices = numpy.where(arr2d[col_index] % 2 == 0) col_values = arr2d[col_index, col_indices] 

enumerate() devuelve un iterador que produce una tupla (index, item) en cada iteración, por lo que no puede (y no es necesario) llamar a .index() nuevamente.

Además, tu syntax de comprensión de lista es incorrecta:

 indexfuture = [(index, x) for (index, x) in enumerate(df['colname']) if x > yesterday] 

Caso de prueba:

 >>> [(index, x) for (index, x) in enumerate("abcdef") if x > "c"] [(3, 'd'), (4, 'e'), (5, 'f')] 

Por supuesto, no es necesario desempaquetar la tupla:

 >>> [tup for tup in enumerate("abcdef") if tup[1] > "c"] [(3, 'd'), (4, 'e'), (5, 'f')] 

a menos que solo te interesen los índices, en cuyo caso podrías hacer algo como

 >>> [index for (index, x) in enumerate("abcdef") if x > "c"] [3, 4, 5] 

Y si necesita una statement adicional, panda.Series le permite realizar operaciones entre series (+, -, /,, *).

Solo multiplica los índices:

 idx1 = df['lat'] == 49 idx2 = df['lng'] > 15 idx = idx1 * idx2 new_df = df[idx] 

En lugar de enumerate , normalmente solo uso .iteritems . Esto guarda un .index() . A saber,

 [k for k, v in (df['c'] > t).iteritems() if v] 

De lo contrario, uno tiene que hacer

 df[df['c'] > t].index() 

Esto duplica la escritura del nombre del dataframe, que puede ser muy largo y difícil de escribir.

Una buena forma simple y ordenada de hacer esto es la siguiente:

 SlicedData1 = df[df.colname>somenumber]] 

Esto se puede ampliar fácilmente para incluir otros criterios, como los datos no numéricos:

 SlicedData2 = df[(df.colname1>somenumber & df.colname2=='24/08/2018')] 

Y así…