Pandas Ersetzen Sie NaN durch eine leere Zeichenfolge


217

Ich habe einen Pandas-Datenrahmen wie unten gezeigt:

    1    2       3
 0  a  NaN    read
 1  b    l  unread
 2  c  NaN    read

Ich möchte die NaN-Werte mit einer leeren Zeichenfolge entfernen, damit es so aussieht:

    1    2       3
 0  a   ""    read
 1  b    l  unread
 2  c   ""    read

Antworten:


260
import numpy as np
df1 = df.replace(np.nan, '', regex=True)

Dies könnte helfen. Alle NaNs werden durch eine leere Zeichenfolge ersetzt.


1
Aus welcher Bibliothek kommt np.nandas? Ich kann es nicht benutzen
CaffeineConnoisseur

8
@CaffeineConnoisseur : import numpy as np.
John Zwinck

26
@CaffeineConnoisseur - oder einfach nur, pd.np.nanwenn Sie es nicht wollen import numpy.
elPastor

1
Auf diese Weise kann das Diktat auch als Zeichenfolge in der Zeile einer CSV- pd.DataFrame.from_dict(eval(_string_))
Datei

5
Auch nützlich, um die ... inplace=TrueOption zu erwähnen .
smci

340
df = df.fillna('')

oder nur

df.fillna('', inplace=True)

Dies wird Na's (zB NaN's) mit füllen ''.

Wenn Sie eine einzelne Spalte füllen möchten, können Sie Folgendes verwenden:

df.column1 = df.column1.fillna('')

Man kann df['column1']statt verwenden df.column1.


5
@Mithril -df[['column1','column2']] = df[['column1','column2']].fillna('')
elPastor

99

Wenn Sie den Datenrahmen aus einer Datei (z. B. CSV oder Excel) lesen, verwenden Sie:

  • df.read_csv(path , na_filter=False)
  • df.read_excel(path , na_filter=False)

Dadurch werden die leeren Felder automatisch als leere Zeichenfolgen betrachtet ''


Wenn Sie den Datenrahmen bereits haben

  • df = df.replace(np.nan, '', regex=True)
  • df = df.fillna('')

na_filter ist nicht verfügbar auf read_excel () pandas.pydata.org/pandas-docs/stable/…
Marjorie Roswell

Ich habe es in meiner Anwendung verwendet. Es existiert zwar, aber aus irgendeinem Grund haben sie dieses Argument in den Dokumenten nicht angegeben. Es funktioniert gut für mich, aber ohne Fehler.
Natesh Bhat

Es funktioniert, ich benutze es in Analysexl.parse('sheet_name', na_filter=False)
Dmitrii

5

Verwenden Sie einen Formatierer, wenn Sie ihn nur so formatieren möchten, dass er beim Drucken gut wiedergegeben wird . Verwenden Sie einfach die df.to_string(... formatters, um die benutzerdefinierte Zeichenfolgenformatierung zu definieren, ohne Ihren DataFrame unnötig zu ändern oder Speicherplatz zu verschwenden:

df = pd.DataFrame({
    'A': ['a', 'b', 'c'],
    'B': [np.nan, 1, np.nan],
    'C': ['read', 'unread', 'read']})
print df.to_string(
    formatters={'B': lambda x: '' if pd.isnull(x) else '{:.0f}'.format(x)})

Bekommen:

   A B       C
0  a      read
1  b 1  unread
2  c      read

4
print df.fillna('')an sich (ohne es zu tun df = df.fillna('')) ändert auch nicht das Original. Gibt es eine Geschwindigkeit oder einen anderen Vorteil bei der Verwendung to_string?
Fantabolisch

Fair genug ist df.fillna('')es!
Steve Schulist

@shadowtalker: Nicht unbedingt, es wäre nur die richtige Antwort, wenn das OP die df in einem Format halten wollte (z. B. rechnerisch effizienter oder Speicherplatz für unnötige / leere / doppelte Zeichenfolgen sparen) und sie dennoch visuell in einer größeren Form rendern wollte angenehmer Weg. Ohne mehr über den Anwendungsfall zu wissen, können wir nicht sicher sagen.
smci

2

Versuche dies,

hinzufügen inplace=True

import numpy as np
df.replace(np.NaN, ' ', inplace=True)

1

Verwenden keep_default_na=False sollte Ihnen helfen:

df = pd.read_csv(filename, keep_default_na=False)

0

Wenn Sie Datenrahmen zu JSON konvertieren, NaNwird Fehler geben , so beste Lösung in diesem Anwendungsfall ist zu ersetzen NaNmit None.
Hier ist, wie:

df1 = df.where((pd.notnull(df)), None)

0

Ich habe es mit einer Spalte von String-Werten mit nan versucht.

So entfernen Sie die Nan und füllen die leere Zeichenfolge:

df.columnname.replace(np.nan,'',regex = True)

So entfernen Sie die Nan und füllen einige Werte:

df.columnname.replace(np.nan,'value',regex = True)

Ich habe es auch mit df.iloc versucht. aber es braucht den Index der Spalte. Sie müssen also erneut in die Tabelle schauen. einfach die obige Methode um einen Schritt reduziert.

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.