2013-04-15 15 views
5

Sto usando la libreria NumPy in Python per importare i dati del file CSV in un ndarray come segue:Come conservare i nomi delle colonne durante l'importazione dei dati usando numpy?

data = np.genfromtxt('mydata.csv', 
        delimiter='\,', dtype=None, names=True) 

Il risultato fornisce i seguenti nomi di colonna:

print(data.dtype.names) 

('row_label', 
'MyDataColumn1_0', 
'MyDataColumn1_1') 

I nomi delle colonne originali sono:

ROW_LABEL, My-Data-Colonna-1.0, My-Data-colonna-1,1

Sembra che numpy stia costringendo i nomi delle mie colonne ad adottare la formattazione del nome di variabile in stile C. Tuttavia ci sono molti casi in cui i miei script Python richiedono l'accesso alle colonne in base al nome della colonna, quindi devo assicurarmi che i nomi delle colonne rimangano costanti. Per fare ciò, numpy deve conservare i nomi originali delle colonne oppure devo convertire i nomi delle mie colonne nel formato che numpy sta usando.

C'è un modo per mantenere i nomi delle colonne originali durante l'importazione? In caso contrario, c'è un modo semplice per convertire le etichette di colonne per usare il formato che numpy sta usando, preferibilmente usando una funzione numpy?

+0

vedere qui: http://stackoverflow.com/questions/14429992/can-i-rename-fields-in-a-numpy-record-array –

+0

@RichardHollis questo i Non è la stessa domanda: posso già importare i nomi delle colonne, ma voglio preservarne la formattazione. Forse dovrei modificare il titolo della domanda. – holocronweaver

risposta

3

se si imposta names=True, quindi la prima riga del file di dati viene passato attraverso questa funzione:

validate_names = NameValidator(excludelist=excludelist, 
           deletechars=deletechars, 
           case_sensitive=case_sensitive, 
           replace_space=replace_space) 

Queste sono le opzioni che si possono fornire:

excludelist : sequence, optional 
    A list of names to exclude. This list is appended to the default list 
    ['return','file','print']. Excluded names are appended an underscore: 
    for example, `file` would become `file_`. 
deletechars : str, optional 
    A string combining invalid characters that must be deleted from the 
    names. 
defaultfmt : str, optional 
    A format used to define default field names, such as "f%i" or "f_%02i". 
autostrip : bool, optional 
    Whether to automatically strip white spaces from the variables. 
replace_space : char, optional 
    Character(s) used in replacement of white spaces in the variables 
    names. By default, use a '_'. 

Forse si potrebbe provare per fornire la propria stringa deletechars che è una stringa vuota. Ma si sarebbe meglio modifica e passare questo:

defaultdeletechars = set("""[email protected]#$%^&*()-=+~\|]}[{';: /?.>,<""") 

Basta estrarre il periodo e segno meno da quello impostato, e passarlo come:

np.genfromtxt(..., names=True, deletechars="""[email protected]#$%^&*()=+~\|]}[{';: /?>,<""") 

Ecco la fonte: https://github.com/numpy/numpy/blob/master/numpy/lib/_iotools.py#l245

+0

Apprezzo direttamente il collegamento del codice sorgente pertinente e l'aggiunta di un'alternativa migliore a una stringa vuota per deletechar. Funziona esattamente come hai suggerito. Grazie! – holocronweaver

+0

Prego, contento che funzioni per il tuo caso. Probabilmente lo sai, ma se andrai in futuro, il tuo codice sarà più solido se puoi provare a mantenere i nomi delle colonne più semplici ed evitare i caratteri comunemente proibiti. – askewchan

Problemi correlati