2012-06-03 2 views
31

Sto utilizzando la libreria pandas per leggere in alcuni dati CSV. Nei miei dati, alcune colonne contengono stringhe. La stringa "nan" è un valore possibile, come una stringa vuota. Sono riuscito a far sì che i panda leggessero "nan" come una stringa, ma non riesco a capire come ottenerlo per non leggere un valore vuoto come NaN. Ecco dati campione e uscitaOttieni pandas.read_csv per leggere i valori vuoti come stringa vuota anziché nan

One,Two,Three 
a,1,one 
b,2,two 
,3,three 
d,4,nan 
e,5,five 
nan,6, 
g,7,seven 

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []}) 
    One Two Three 
0 a 1 one 
1 b 2 two 
2 NaN 3 three 
3 d 4 nan 
4 e 5 five 
5 nan 6 NaN 
6 g 7 seven 

Si legge correttamente "nan" come stringa "nan', ma legge ancora le celle vuote come NaN. Ho provato passando str nell'argomento converters a read_csv (con converters={'One': str})), ma legge ancora le celle vuote come NaN.

Mi rendo conto che posso riempire i valori dopo aver letto, con fillna, ma non c'è davvero modo di dire ai panda che una cella vuota in una particolare colonna CSV dovrebbe essere letta come stringa vuota invece di NaN?

risposta

27

ho aggiunto un biglietto per aggiungere un'opzione di qualche tipo qui:

https://github.com/pydata/pandas/issues/1450

Nel frattempo, result.fillna('') dovrebbe fare quello che vuoi

EDIT: nella versione di sviluppo (per essere 0.8 .0 finale) se si specifica una lista vuota di na_values, le stringhe vuote rimarranno stringhe vuote nel risultato

+6

[Documentazione per 'DataFrame.fillna'.] (Http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html) Prova' result.fillna ('', inplace = True) '. Altrimenti crea una copia del dataframe. – osa

+1

scusa per far risorgere una risposta così vecchia, ma è mai successo? Per quanto posso dire da [questo GitHub PR] (https: // github.com/pydata/pandas/pull/1522) è stato chiuso senza mai essere unito, e non vedo il comportamento richiesto nella versione panda 0.14.x – drammock

+7

[Documentazione] (http://pandas.pydata.org/pandas- docs/stable/generated/pandas.read_csv.html) per read_csv ora offre sia 'na_values' (list o dict indicizzato da colonne) e' keep_default_na' (bool). Il valore 'keep_default_na' indica se i valori NA di default dei panda devono essere sostituiti o aggiunti. Il codice dell'OP non funziona al momento solo perché manca questo flag. Per questo esempio, potresti usare 'pandas.read_csv ('test.csv', na_values ​​= ['nan'], keep_default_na = False)'. – delgadom

-1

Utilizzare il metodo fillna, ma utilizzarlo due volte 'nan' = 'nan', 'NaN' = "". Ciò manterrebbe la virgola allineata. Se il NAN non fosse presente, le colonne non si allineano. Ricorda: nan non è uguale a NaN.

+1

Non capisco la tua risposta. Come ho detto, non voglio usare fillna o qualsiasi altra chiamata di metodo dopo la lettura. Sto chiedendo se c'è un modo per rendere la conversione avviene durante l'operazione di lettura CSV. – BrenBarn

+0

Downvote, davvero ?! La tua domanda non è chiara. D: Effettua la conversione durante l'operazione di lettura CSV. A: No, ho già fatto la stessa domanda, SO l'ho cancellata. Devi elaborare in due passaggi. Lo stesso vale per il modulo CSV, due passaggi. – Merlin

12

Ero ancora confuso dopo aver letto le altre risposte e commenti. Ma la risposta ora sembra più semplice, quindi ecco qui.

Dal Pandas versione 0.9 (dal 2012), è possibile leggere il tuo csv con celle vuote interpretati come stringhe vuote semplicemente impostando keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False) 

Questo problema è più chiaramente spiegato nel

Questo problema è stato risolto il 19 agosto 2012 per la versione 0.9 di Pandas in