Lassen Sie pandas.read_csv leere Werte als leere Zeichenfolge anstelle von nan lesen


91

Ich benutze die Pandas-Bibliothek, um einige CSV-Daten einzulesen. In meinen Daten enthalten bestimmte Spalten Zeichenfolgen. Die Zeichenfolge "nan"ist ein möglicher Wert, ebenso wie eine leere Zeichenfolge. Ich habe es geschafft, Pandas dazu zu bringen, "nan" als Zeichenfolge zu lesen, aber ich kann nicht herausfinden, wie ich es bekomme, einen leeren Wert nicht als NaN zu lesen. Hier sind Beispieldaten und Ausgabe

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

Es liest "nan" korrekt als Zeichenfolge "nan", liest aber immer noch die leeren Zellen als NaN. Ich habe versucht, strdas convertersArgument an read_csv (with converters={'One': str})) zu übergeben, aber es liest die leeren Zellen immer noch als NaN.

Mir ist klar, dass ich die Werte nach dem Lesen mit fillna füllen kann, aber gibt es wirklich keine Möglichkeit, Pandas mitzuteilen, dass eine leere Zelle in einer bestimmten CSV-Spalte als leere Zeichenfolge anstelle von NaN gelesen werden sollte?


Beachten Sie die einfachere Antwort mit der neueren Option keep_default_naunten.
Nealmcb

Antworten:


52

Ich habe ein Ticket hinzugefügt, um hier eine Option hinzuzufügen:

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

In der Zwischenzeit result.fillna('')sollte tun, was Sie wollen

BEARBEITEN: Wenn Sie in der Entwicklungsversion (endgültig 0.8.0) eine leere Liste angeben na_values, bleiben leere Zeichenfolgen im Ergebnis leer


11
Dokumentation für DataFrame.fillna. Versuchen Sie es result.fillna('', inplace=True). Andernfalls wird eine Kopie des Datenrahmens erstellt.
osa

1
Es tut mir leid, eine so alte Antwort wiederzubeleben, aber ist das jemals passiert? Soweit ich aus diesem GitHub PR ersehen kann, wurde es geschlossen, ohne jemals zusammengeführt zu werden, und ich sehe das angeforderte Verhalten in Pandas Version 0.14.x
Drammock

9
Die Dokumentation für read_csv bietet jetzt sowohl na_values(durch Spalten indizierte Liste oder Diktat ) als auch keep_default_na(bool). Der keep_default_naWert gibt an, ob die Standard-NA-Werte von Pandas ersetzt oder angehängt werden sollen. Der OP-Code funktioniert derzeit nicht, nur weil dieses Flag fehlt. Für dieses Beispiel könnten Sie verwenden pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False).
Michael Delgado

@delgadom Danke, dass du mich dazu geführt hast keep_default_na. Beachten Sie jedoch, dass er nicht möchte, dass 'nan' auch als Standard behandelt wird. Ich habe eine vollständigere Erklärung als neue Antwort hinzugefügt.
Nealmcb

104

Ich war immer noch verwirrt, nachdem ich die anderen Antworten und Kommentare gelesen hatte. Aber die Antwort scheint jetzt einfacher zu sein, also los geht's.

Seit Pandas Version 0.9 (ab 2012) können Sie Ihre CSV mit leeren Zellen lesen, die als leere Zeichenfolgen interpretiert werden, indem Sie einfach Folgendes festlegen keep_default_na=False:

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

Dieses Problem wird in näher erläutert

Das wurde am 19. August 2012 für Pandas Version 0.9 in behoben


3
Dies ist eindeutig die beste Antwort, sie sollte als erste Lösung bezeichnet werden. Danke @nealmcb
dzof31

2
Warum ist dies keine populärere Antwort? Ich habe seit gestern nach dieser Lösung gesucht. Vielen Dank!
Anish

7

Wir haben ein einfaches Argument in Pandas read_csv dafür:

Verwenden:

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

In der Pandas-Dokumentation wird klar erklärt, wie das obige Argument funktioniert.

Verknüpfung


Es sieht aus wie die OP nicht verwenden möchte na_values„nan“ zu erkennen, aber drehen na_filterwürde Niederlage aus ganz das. Also meine Antwort mit keep_default_na=False.
Nealmcb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.