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
user1452759
quelle

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.

Neo
quelle
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.

fantastisch
quelle
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('')
Natesh bhat
quelle
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
Steve Schulist
quelle
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)
Vineesh TP
quelle
1

Verwenden keep_default_na=False sollte Ihnen helfen:

df = pd.read_csv(filename, keep_default_na=False)
Bendy Latortue
quelle
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)
Dinesh Khetarpal
quelle
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.

Subbu VidyaSekar
quelle