Dienstag, Dezember 10, 2019

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 die False 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

InformationsquelleAutor Michael K | 2015-05-29

4 Kommentare

  1. 12

    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:

    In [59]:
    df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
    mask = df.isin([1, 3, 12, 'a'])
    df = df.where(mask, other=30)
    df
    
    Out[59]:
        A   B
    0   1   a
    1  30  30
    2   3  30

    Beachten Sie: die oben schlägt fehl, wenn Sie tun inplace=True im where Methode, so df.where(mask, other=30, inplace=True) erhöhen:

    TypeError: Nicht inplace boolean Einstellung auf “ mixed-Typen mit einer nicht
    np.nan-Wert

    BEARBEITEN

    OK, nach einem kleinen Missverständnis kann man noch verwenden where y nur das invertieren der Maske:

    In [2]:    
    df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
    mask = df.isin([1, 3, 12, 'a'])
    df.where(~mask, other=30)
    
    Out[2]:
        A   B
    0  30  30
    1   2   b
    2  30   f
    • Sind die Ergebnisse richtig? Sollte 30 ausgefüllt werden, für das Wahre oder für das Falsche Werte? Es ist das Gegenteil von dem, was ich dachte, war gefragt (obwohl ich hätte es nach hinten), und es konnte problemlos rückgängig gemacht werden, indem die Ergänzung der Maske.
    • ja das ist richtig, ich habe gerade nochmals geprüft werden
    • wenn Sie where wird die Maske zu erzeugen, die ursprünglichen Werte, wenn man die Maske ist True, die other Wert wird verwendet, wo die Maske ist False, so der Standard für other ist NaN, so sieht es verwirrend, aber das ist die erwartete und gewünschte Ergebnis
    • Ich bin damit einverstanden, dass ‚ s, wie der code funktioniert und ist soll, ich bin einfach nur sagen, dass es das Gegenteil zu sein scheint von dem, was angesprochen wurde. Wenn Sie den OP-code auf nur Eine Spalte, zum Beispiel, erzeugt er 30 2 30.
    • ja, das scheint zweideutig, ich lese seine Frage als einen Weg, Sie zu ersetzen 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 Ihre
    • Yep, keine Sorge. Ich habe gerade festgestellt, wir hatten genau entgegengesetzte Ergebnisse. Ich denke, dein Ansatz ist sauberer und es von Ihnen positiv bewertet werden.

  2. 3

    Bin 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:

    df[:] = np.where( mask, 30, df ) 
    
        A   B
    0  30  30
    1   2   b
    2  30   f
  3. 1

    pandas verwendet NaN zu markieren ungültige oder fehlende Daten, und kann verwendet werden, über Typen, die da Ihre DataFrame als gemischte int-und string-Datentypen es wird nicht akzeptieren, die Zuordnung zu einer einzigen Art (außer NaN) als eine gemischte Typen (int und str) in B durch eine in-place-Zuordnung.

    @JohnE Methode mit np.where erstellt eine neue DataFrame in dem die Art der Spalte B ist ein Objekt, kein string, wie im ersten Beispiel.

  4. 1

    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 in B_1 und B_2. Zum Beispiel, ersetzen Sie die Werte in A (999) entspricht null in B.

    Dem ursprünglichen dataframe:

       A_1  A_2  B_1  B_2
    0    1    4    y    n
    1    2    5    n  NaN
    2    3    6  NaN  NaN

    Den gewünschten dataframe

       A_1  A_2  B_1  B_2
    0    1    4    y    n
    1    2  999    n  NaN
    2  999  999  NaN  NaN

    Code:

    df = pd.DataFrame({
         'A_1': [1, 2, 3], 
         'A_2': [4, 5, 6], 
         'B_1': ['y', 'n', np.nan], 
         'B_2': ['n', np.nan, np.nan]})
    
    _mask = df[['B_1', 'B_2']].notnull().values
    df[['A_1', 'A_2']] = df[['A_1','A_2']].where(_mask, other=999)
    
    
    
       A_1  A_2
    0    1    4
    1    2  999
    2  999  999

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...