pandas DataFrame legen Wert auf boolean Maske
Ich versuche mit einer Anzahl von verschiedenen in ein pandas DataFrame alle auf den gleichen Wert. Ich dachte, ich Verstand Boolesche Indexierung für die pandas, aber ich habe nicht gefunden, alle Ressourcen auf diesem speziellen Fehler.
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
mask = df.isin([1, 3, 12, 'a'])
df[mask] = 30
Traceback (most recent call last):
...
TypeError: Cannot do inplace boolean setting on mixed-types with a non np.nan value
Oben, ich alle ersetzen will, der True
Einträge in der Maske mit dem Wert 30
.
Konnte ich tun df.replace
statt, aber die Maskierung fühlt sich ein bisschen intuitiver und effizienter hier. Kann jemand erklären Sie den Fehler und bieten eine effiziente Möglichkeit, um alle Werte?
- Könnten Sie bestätigen, ob meine Antwort oder JohnE ' s Ergebnis ist das, was Sie gewünscht und aktualisieren Sie Ihre Frage klar darauf hinweisen, danke
- Danke, @EdChum. Ich wollte, um die
True
Werte in die Maske ein und verlassen Sie dieFalse
Werte die gleichen. Ich bearbeitet die Frage für Klarheit. - Keine Sorge, ich aktualisierte meine Antwort, Sie einfach nur invertieren der Maske zu erreichen, was Sie wollen
- Hey, Ihr rufen, aber ich wollte nicht für Sie, schalten Sie das Häkchen, nur versuchen zu klären, gewünschte Ergebnisse. Ich denke, @EdChums Antwort ist etwas sauberer und präziser, wenn Sie wollen, schalten Sie es zurück zu sein.
- Ja, du hast Recht. Sie sind beide gute Antworten. Sorry an alle!
- Mach dir keine sorgen über das Häkchen, dass das, was die upvotes sind, da es viele richtige Antworten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht mit der boolean-Maske auf gemischte dtypes für diesen leider kann man mit den pandas
where
um die Werte festzulegen:Beachten Sie: die oben schlägt fehl, wenn Sie tun
inplace=True
imwhere
Methode, sodf.where(mask, other=30, inplace=True)
erhöhen:BEARBEITEN
OK, nach einem kleinen Missverständnis kann man noch verwenden
where
y nur das invertieren der Maske:where
wird die Maske zu erzeugen, die ursprünglichen Werte, wenn man die Maske istTrue
, dieother
Wert wird verwendet, wo die Maske istFalse
, so der Standard fürother
istNaN
, so sieht es verwirrend, aber das ist die erwartete und gewünschte Ergebnis30 2 30
.NaN
Werte, aber es liest sich mehr wie Ihre Antwort, aber die OP akzeptierte meine Antwort, also ist es mir unklar, ob er wollte dieses Ergebnis aber gefragt, für IhreBin ich mir nicht 100% sicher, aber ich vermute, die Fehlermeldung bezieht sich auf die Tatsache, dass es nicht identische Behandlung von fehlenden Daten über verschiedene dtypes. Nur Schwimmer hat NaN, aber die ganzen zahlen können werden automatisch umgewandelt schwimmt, so dass es kein problem gibt. Aber es scheint, Misch-Anzahl dtypes und Objekt dtypes funktioniert nicht so leicht...
Unabhängig davon, dass Sie bekommen konnte, um es sich ziemlich leicht mit
np.where
:pandas
verwendetNaN
zu markieren ungültige oder fehlende Daten, und kann verwendet werden, über Typen, die da IhreDataFrame
als gemischte int-und string-Datentypen es wird nicht akzeptieren, die Zuordnung zu einer einzigen Art (außerNaN
) als eine gemischte Typen (int und str) inB
durch eine in-place-Zuordnung.@JohnE Methode mit
np.where
erstellt eine neueDataFrame
in dem die Art der SpalteB
ist ein Objekt, kein string, wie im ersten Beispiel.Wenn Sie wollen verwenden Sie verschiedene Spalten anlegen Ihrer Maske, müssen Sie rufen Sie die
values
Eigenschaft der dataframe.Beispiel
Sagen wir, wir möchten, ersetzen Sie Werte in
A_1
und 'A_2' nach einer Maske inB_1
undB_2
. Zum Beispiel, ersetzen Sie die Werte inA
(999) entspricht null inB
.Dem ursprünglichen dataframe:
Den gewünschten dataframe
Code: