281 Stimmen

Pandas GroupBy-Spalten mit NaN (fehlenden) Werten

Ich habe ein DataFrame mit vielen fehlenden Werten in Spalten, die ich gruppieren möchte:

import pandas as pd
import numpy as np
df = pd.DataFrame({'a': ['1', '2', '3'], 'b': ['4', np.NaN, '6']})

In [4]: df.groupby('b').groups
Out[4]: {'4': [0], '6': [2]}

Sehen Sie, dass Pandas die Zeilen mit NaN-Zielwerten fallen gelassen hat. (Ich möchte diese Zeilen einschließen!)

Da ich viele solcher Operationen benötige (viele Spalten haben fehlende Werte) und kompliziertere Funktionen als nur Mediane verwende (typischerweise Random Forests), möchte ich vermeiden, zu komplizierte Code-Stücke zu schreiben.

Irgendwelche Vorschläge? Sollte ich eine Funktion dafür schreiben oder gibt es eine einfache Lösung?

6voto

Tuetschek Punkte 409

Eine kleine Anmerkung zu Andy Haydens Lösung - sie funktioniert (nicht mehr?), weil np.nan == np.nan False ergibt und die replace-Funktion also tatsächlich nichts tut.

Was bei mir funktioniert hat, war folgendes:

df['b'] = df['b'].apply(lambda x: x if not np.isnan(x) else -1)

(Zumindest ist das das Verhalten für Pandas 0.19.2. Tut mir leid, dass ich es als separate Antwort hinzufüge, ich habe nicht genug Ruf, um zu kommentieren.)

5voto

Ich habe das bereits beantwortet, aber aus irgendeinem Grund wurde die Antwort in einen Kommentar umgewandelt. Trotzdem ist dies die effizienteste Lösung:

Es ist ziemlich frustrierend, NaNs in Gruppen nicht einschließen (und übertragen) zu können. Das Argument mit R ist nicht überzeugend, da dieses Verhalten nicht mit vielen anderen Dingen konsistent ist. Wie auch immer, der Dummy-Hack ist auch ziemlich schlecht. Die Größe (beinhaltet NaNs) und die Anzahl (ignoriert NaNs) einer Gruppe werden sich jedoch unterscheiden, wenn es NaNs gibt.

dfgrouped = df.groupby(['b']).a.agg(['sum','size','count'])

dfgrouped['sum'][dfgrouped['size']!=dfgrouped['count']] = None

Wenn diese Werte unterschiedlich sind, können Sie den Wert für das Ergebnis der Aggregationsfunktion für diese Gruppe auf None setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X