Ich möchte alle Werte in einem Pandas-Datenrahmen finden, die Leerzeichen (eine beliebige Menge) enthalten, und diese Werte durch NaNs ersetzen.
Irgendwelche Ideen, wie dies verbessert werden kann?
Grundsätzlich möchte ich das umdrehen:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz
2000-01-05 -0.222552 4
2000-01-06 -1.176781 qux
Das mögen:
A B C
2000-01-01 -0.532681 foo 0
2000-01-02 1.490752 bar 1
2000-01-03 -1.387326 foo 2
2000-01-04 0.814772 baz NaN
2000-01-05 -0.222552 NaN 4
2000-01-06 -1.176781 qux NaN
Ich habe es mit dem folgenden Code geschafft, aber Mann, ist es hässlich. Es ist nicht Pythonic und ich bin sicher, es ist auch nicht die effizienteste Verwendung von Pandas. Ich durchlaufe jede Spalte und ersetze sie boolesch gegen eine Spaltenmaske, die durch Anwenden einer Funktion generiert wird, die eine Regex-Suche für jeden Wert durchführt und mit Leerzeichen übereinstimmt.
for i in df.columns:
df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None
Es könnte ein wenig optimiert werden, indem nur Felder durchlaufen werden, die leere Zeichenfolgen enthalten könnten:
if df[i].dtype == np.dtype('object')
Aber das ist keine große Verbesserung
Und schließlich setzt dieser Code die Zielzeichenfolgen auf Keine, was mit Pandas 'Funktionen wie funktioniert fillna()
, aber der Vollständigkeit halber wäre es schön, wenn ich tatsächlich eine NaN
direkt anstelle von einfügen könnte None
.
replace
mit einem regulären Ausdruck arbeiten zu können ... (vielleicht sollte dies als Funktion angefordert werden).Antworten:
Ich denke
df.replace()
macht den Job, seit Pandas 0.13 :Produziert:
Verwenden Sie, wie Temak betonte, den
df.replace(r'^\s+$', np.nan, regex=True)
Fall, dass Ihre gültigen Daten Leerzeichen enthalten.quelle
pd.Series(["1", "#", "9", " .", None]).replace(r"( +\.)|#", "X", regex=True).values
was gibt['1', 'X', '9', 'X', None]
df.replace(r'^\s+$', np.nan, regex=True)
Wenn Sie eine leere Zeichenfolge und Datensätze durch Leerzeichen ersetzen möchten, lautet die richtige Antwort !
Die akzeptierte Antwort
Ersetzt keine leere Zeichenfolge!, Können Sie sich mit dem angegebenen Beispiel leicht aktualisieren versuchen:
Beachten Sie auch, dass 'fo o' nicht durch Nan ersetzt wird, obwohl es ein Leerzeichen enthält. Weitere Anmerkung, dass eine einfache:
Funktioniert auch nicht - probieren Sie es aus.
quelle
Wie wäre es mit:
Die
applymap
Funktion wendet eine Funktion auf jede Zelle des Datenrahmens an.quelle
isinstance
etwas schneller sein wird.''
. Um auch leere Zeichenfolgen zu berücksichtigen, verwenden Sie:d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and (not x or x.isspace()) else x)
Ich werde das tun:
oder
Sie können alle str abisolieren und dann leere str durch ersetzen
np.nan
.quelle
Einfachste aller Lösungen:
quelle
Wenn Sie die Daten aus der CSV-Datei exportieren, kann dies so einfach sein:
Dadurch wird der Datenrahmen erstellt und leere Werte als Na ersetzt
quelle
skipinitialspace=True
entfernt auch Leerzeichen nach dem Trennzeichen, die dazu führen würden, dass leere Zeichenfolgen mit beliebiger Länge von Leerzeichen gelesen werdennan
. Wenn Sie jedoch die anfänglichen Leerzeichen aus irgendeinem Grund beibehalten möchten, ist diese Option keine gute Wahl.Für eine sehr schnelle und einfache Lösung, bei der Sie die Gleichheit mit einem einzelnen Wert vergleichen, können Sie die
mask
Methode verwenden.quelle
Diese sind alle nahe an der richtigen Antwort, aber ich würde nicht sagen, dass sie das Problem lösen, während sie für andere, die Ihren Code lesen, am besten lesbar bleiben. Ich würde sagen, dass die Antwort eine Kombination aus BrenBarns Antwort und Tuomasttiks Kommentar unter dieser Antwort ist . Die Antwort von
isspace
BrenBarn verwendet integrierte Funktionen, unterstützt jedoch nicht das Entfernen leerer Zeichenfolgen, wie von OP angefordert, und ich würde dies eher als Standardanwendungsfall für das Ersetzen von Zeichenfolgen durch null angeben.Ich habe es mit umgeschrieben
.apply
, damit du es auf einempd.Series
oder aufrufen kannstpd.DataFrame
.Python 3:
So ersetzen Sie leere Zeichenfolgen oder Zeichenfolgen mit vollständig Leerzeichen:
So ersetzen Sie Zeichenfolgen mit vollständig Leerzeichen:
Um dies zu verwenden in Python 2, müssen Sie ersetzen
str
mitbasestring
.Python 2:
So ersetzen Sie leere Zeichenfolgen oder Zeichenfolgen mit vollständig Leerzeichen:
So ersetzen Sie Zeichenfolgen mit vollständig Leerzeichen:
quelle
Das hat bei mir funktioniert. Beim Importieren meiner CSV-Datei habe ich na_values = '' hinzugefügt. Leerzeichen sind in den Standard-NaN-Werten nicht enthalten.
df = pd.read_csv (Dateipfad, na_values = '')
quelle
Sie können dazu auch einen Filter verwenden.
quelle
quelle
Dies ist keine elegante Lösung, aber was zu funktionieren scheint, ist das Speichern in XLSX und das anschließende Importieren. Die anderen Lösungen auf dieser Seite haben bei mir nicht funktioniert, ich weiß nicht warum.
quelle