read_csv index example dtype columns pandas

index - ¿Cómo puedo filtrar líneas en carga en la función pandas read_csv?



pandas select rows by condition (3)

No encontré una manera directa de hacerlo dentro del contexto de read_csv . Sin embargo, read_csv devuelve un DataFrame, que se puede filtrar seleccionando filas por boolean vector df[bool_vec] :

filtered = df[(df[''timestamp''] > targettime)]

Esto es seleccionar todas las filas en df (suponiendo que df es cualquier DataFrame, como el resultado de una llamada read_csv , que al menos contiene una timestamp datetime de la columna) para la cual los valores en la columna timestamp son mayores que el valor de targettime. Pregunta similar

¿Cómo puedo filtrar qué líneas de un CSV cargar en la memoria usando pandas? Esto parece una opción que uno debería encontrar en read_csv . ¿Me estoy perdiendo de algo?

Ejemplo: tenemos un archivo CSV con una columna de marca de tiempo y queremos cargar solo las líneas que tienen una marca de tiempo mayor que una constante dada.


No hay una opción para filtrar las filas antes de que el archivo CSV se cargue en un objeto pandas.

Puede cargar el archivo y luego filtrar usando df[df[''field''] > constant] , o si tiene un archivo muy grande y le preocupa que la memoria se agote, utilice un iterador y aplique el filtro a medida que concatena trozos de su archivo, por ejemplo:

import pandas as pd iter_csv = pd.read_csv(''file.csv'', iterator=True, chunksize=1000) df = pd.concat([chunk[chunk[''field''] > constant] for chunk in iter_csv])

Puede variar el chunksize para adaptarse a su memoria disponible. Mira here para más detalles.


Si estás en Linux puedes usar grep.

# to import either on Python2 or Python3 import pandas as pd from time import time # not needed just for timing try: from StringIO import StringIO except ImportError: from io import StringIO def zgrep_data(f, string): ''''''grep multiple items f is filepath, string is what you are filtering for'''''' grep = ''grep'' # change to zgrep for gzipped files print(''{} for {} from {}''.format(grep,string,f)) start_time = time() if string == '''': out = subprocess.check_output([grep, string, f]) grep_data = StringIO(out) data = pd.read_csv(grep_data, sep='','', header=0) else: # read only the first row to get the columns. May need to change depending on # how the data is stored columns = pd.read_csv(f, sep='','', nrows=1, header=None).values.tolist()[0] out = subprocess.check_output([grep, string, f]) grep_data = StringIO(out) data = pd.read_csv(grep_data, sep='','', names=columns, header=None) print(''{} finished for {} - {} seconds''.format(grep,f,time()-start_time)) return data