2012-11-30 18 views

risposta

82

Non esiste un'opzione per filtrare le righe prima che il file CSV venga caricato in un oggetto panda.

È possibile caricare il file e quindi filtrare utilizzando df[df['field'] > constant] oppure se si dispone di un file molto grande e si è preoccupati che la memoria si esaurisca, quindi utilizzare un iteratore e applicare il filtro mentre si concatenano blocchi del file ad esempio:

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

È possibile variare chunksize in base alla memoria disponibile. Vedi here per maggiori dettagli.

+0

per 'chunk ['filed']> constant' posso inserirlo tra 2 valori costanti? Es .: costante1> pezzo ['campo']> costante2. O posso usare "nel raggio"? – weefwefwqg3

4

Non ho trovato un modo semplice per farlo nel contesto di read_csv. Tuttavia, read_csv restituisce una dataframe, che può essere filtrato selezionando righe booleana vettore df[bool_vec]:

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

Questo sta selezionando tutte le righe df (supponendo df è qualunque dataframe, come il risultato di una chiamata read_csv, che contiene almeno una colonna datetime timestamp) per la quale i valori nella colonna timestamp sono maggiori del valore di targettime. Similar question.

0

Se si utilizza Linux, è possibile utilizzare 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 
Problemi correlati