¿Cómo puedo filtrar qué líneas de un CSV se cargarán en la memoria usando pandas? Esta parece una opción en la que uno debería encontrar read_csv
. ¿Me estoy perdiendo de algo?
Ejemplo: tenemos un CSV con una columna de marca de tiempo y nos gustaría cargar solo las líneas que tienen una marca de tiempo mayor que una constante dada.
chunk['filed']>constant
puedo Sandwich lugar entre los 2 valores constantes? Por ejemplo: constante1> fragmento ['campo']> constante2. ¿O puedo usar 'dentro del rango'?chunk[(chunk['field'] > constant2)&(chunk['field']<constant1)]
.loc
?chunk.loc[chunk['field'] > constant]
.loc
. No creo que.loc
existiera en 2012, pero creo que en estos días el uso.loc
es un poco más explícito.No encontré una forma sencilla de hacerlo dentro del contexto de
read_csv
. Sin embargo,read_csv
devuelve un DataFrame, que se puede filtrar seleccionando filas por vector booleanodf[bool_vec]
:Esto es seleccionar todas las filas en df (asumiendo que df es cualquier DataFrame, como el resultado de una
read_csv
llamada, que al menos contiene una columna de fecha y horatimestamp
) para los cuales los valores en latimestamp
columna son mayores que el valor de targettime. Pregunta similar .fuente
Si el rango filtrado es contiguo (como suele ser con los filtros de tiempo (sello)), entonces la solución más rápida es codificar el rango de filas. Simplemente combine
skiprows=range(1, start_row)
con losnrows=end_row
parámetros. Luego, la importación toma segundos, mientras que la solución aceptada tomaría minutos. Unos pocos experimentos con el inicialstart_row
no suponen un gran coste dado el ahorro en tiempos de importación. Observe que mantuvimos la fila de encabezado usandorange(1,..)
.fuente
Si está en Linux, puede usar grep.
fuente
Puede especificar el
nrows
parámetro.import pandas as pd df = pd.read_csv('file.csv', nrows=100)
Este código funciona bien en la versión 0.20.3.
fuente