Ottieni pandas.read_csv per leggere valori vuoti come stringa vuota invece di nan


102

Sto usando la libreria panda per leggere alcuni dati CSV. Nei miei dati, alcune colonne contengono stringhe. La stringa "nan"è un valore possibile, così come una stringa vuota. Sono riuscito a convincere i panda a leggere "nan" come una stringa, ma non riesco a capire come fare in modo che non legga un valore vuoto come NaN. Ecco i dati di esempio e l'output

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

Legge correttamente "nan" come stringa "nan", ma legge ancora le celle vuote come NaN Ho provato a passare strl' convertersargomento a read_csv (con converters={'One': str})), ma legge ancora le celle vuote come NaN.

Mi rendo conto di poter 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 una stringa vuota invece di NaN?


Nota il più semplice, rispondi utilizzando l'opzione più recente di keep_default_naseguito.
nealmcb

Risposte:


57

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

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

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

EDIT: nella versione di sviluppo (che sarà 0.8.0 finale) se specifichi un elenco vuoto di na_values, le stringhe vuote rimarranno stringhe vuote nel risultato


12
Documentazione per DataFrame.fillna. Prova result.fillna('', inplace=True). Altrimenti crea una copia del dataframe.
Sergey Orshanskiy

1
scusa per resuscitare una risposta così vecchia, ma è mai successo? Per quanto posso dire da questo PR GitHub è stato chiuso senza mai essere unito e non vedo il comportamento richiesto nella versione 0.14.x dei panda
drammock

10
La documentazione per read_csv ora offre entrambina_values (list o dict indicizzati per colonne) che keep_default_na(bool). Il keep_default_navalore indica se i valori NA predefiniti dei panda devono essere sostituiti o aggiunti. Il codice dell'OP non funziona attualmente solo perché manca questo flag. Per questo esempio, potresti usare pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado

@delgadom Grazie per avermi portato a keep_default_na. Ma nota che non vuole nemmeno che "nan" venga trattato come predefinito. Ho aggiunto una spiegazione più completa come nuova risposta.
nealmcb

ci siamo imbattuti di nuovo. la correzione è semplice (la risposta migliore è la seguente da mettere keep_default_na=False) ma il comportamento predefinito dei panda su questo è IMO negativo. se per qualche motivo panda read_csv deduce che una colonna non è numerica, non dovrebbe cambiare automaticamente le stringhe vuote in NaN.
pietroppeter

114

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

Dalla versione 0.9 di Pandas (dal 2012), puoi leggere il tuo csv con celle vuote interpretate come stringhe vuote semplicemente impostando keep_default_na=False:

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

Questo problema è spiegato più chiaramente in

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


5
Questa è chiaramente la risposta migliore, dovrebbe essere designata come prima soluzione. Grazie @nealmcb
dzof31

3
Perché questa non è una risposta più popolare? Sto cercando questa soluzione da ieri. Grazie!
anish

7

Abbiamo un semplice argomento in Pandas read_csv per questo:

Uso:

df = pd.read_csv('test.csv', na_filter= False)

La documentazione di Pandas spiega chiaramente come funziona l'argomento di cui sopra.

Link


Sembra che il PO non vuole utilizzare na_valuesper riconoscere "nan", ma girando na_filterfuori del tutto sarebbe sconfiggere questo. Così la mia risposta con keep_default_na=False.
nealmcb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.