2012-11-06 23 views
25

Sto importando i dati di studio in un frame di dati Pandas utilizzando read_csv.Pandas csv-import: mantenere gli zeri iniziali in una colonna

I codici soggetto sono 6 numeri che codificano, tra gli altri, il giorno della nascita. Per alcuni dei miei soggetti questo risulta in un codice con uno zero iniziale (ad esempio "010816").

Quando si importa in Panda, lo zero iniziale viene rimosso e la colonna viene formattata come int64.

C'è un modo per importare questa colonna invariata magari come una stringa?

Ho provato a utilizzare un convertitore personalizzato per la colonna, ma non funziona: sembra che la conversione personalizzata avvenga prima che Pandas converta in int.

+0

Possibile duplicato di [panda leggi \ _csv dtype zeri iniziali] (http: // stackoverflow.it/questions/16929056/pandas-read-csv-dtype-leading-zeros) – firelynx

risposta

0

Non penso che sia possibile specificare un tipo di colonna nel modo desiderato (se non ci sono state modifiche di recente e se il numero di 6 cifre non è una data che è possibile convertire in datetime). Potresti provare a utilizzare np.genfromtxt() e creare lo DataFrame da lì.

EDIT: Dai uno sguardo a Wes Mckinney's blog, potrebbe esserci qualcosa per te. Sembra che ci sia un nuovo parser da pandas 0.10 in arrivo a novembre.

+0

Ho fatto un problema github: https://github.com/pydata/pandas/issues/2184 –

+0

@ Chang She - https: // github.com/pydata/pandas/issues/926 – root

+0

le funzionalità di quel problema sono state fatte sul ramo c-parser ora e dovrebbero arrivare a 0.10. Ho appena fatto una rapida domanda per il numero 2184 e sarà incluso nella versione 0.9.1 presto. Ma sì, usare i dtypes dovrebbe essere il comportamento preferito qui, quindi basta tenere d'occhio 0.10 in circa un mese o giù di lì. –

22

Come indicato in this question/answer da Lev Landau, potrebbe essere una soluzione semplice utilizzare l'opzione converters per una determinata colonna nella funzione read_csv.

converters={'column_name': lambda x: str(x)} 

È possibile fare riferimento a più opzioni di read_csv funtion in pandas.io.parsers.read_csv documentation.

Diciamo che ho un file csv projects.csv come di seguito:

project_name,project_id 
Some Project,000245 
Another Project,000478 

Come per esempio sotto il codice è triming zeri iniziali:

import csv 
from pandas import read_csv 

dataframe = read_csv('projects.csv') 
print dataframe 

Risultato:

[email protected]:~$ python test_dataframe.py 
     project_name project_id 
0  Some Project   245 
1 Another Project   478 
[email protected]:~$ 

Soluzione esempio di codice :

import csv 
from pandas import read_csv 

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)}) 
print dataframe 

risultato richiesto:

[email protected]:~$ python test_dataframe.py 
     project_name project_id 
0  Some Project  000245 
1 Another Project  000478 
[email protected]:~$ 
+0

non funziona per i panda == 0.20.2 –

7

ecco una soluzione più corto, robusto e completamente funzionante:

semplicemente definire un mapping (dizionario) tra i nomi delle variabili e desiderato tipo di dati:

dtype_dic= {'subject_id': str, 
      'subject_number' : 'float'} 

utilizzare quella mappatura con pd.read_csv():

df = pd.read_csv(yourdata, dtype = dtype_dic) 

et voilà!

+0

puoi anche includere molti altri tipi di dati, 'float' e altri. Credo che questa sia la soluzione più pandasica –

+0

Semplice e al punto. Lo adoro! Grazie buon signore! – racl101

+0

non funziona per i panda == 0.20.2 –

Problemi correlati