Ich habe einen DataFrame mit vielen fehlenden Werten in Spalten, nach denen 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 gelöscht 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 (normalerweise zufällige Gesamtstrukturen) verwende, möchte ich vermeiden, zu komplizierte Codeteile zu schreiben.
Irgendwelche Vorschläge? Soll ich dafür eine Funktion schreiben oder gibt es eine einfache Lösung?
dropna=False
in dergroupby()
gewünschte Ergebnis zu erhalten. Weitere InformationenAntworten:
Dies wird im Abschnitt Fehlende Daten der Dokumente erwähnt :
Eine Problemumgehung besteht darin, vor dem Ausführen der Gruppe einen Platzhalter zu verwenden (z. B. -1):
Das heißt, das fühlt sich ziemlich schrecklich an ... vielleicht sollte es eine Option geben, NaN in groupby aufzunehmen (siehe dieses Github-Problem - das denselben Platzhalter-Hack verwendet).
quelle
Altes Thema, wenn jemand immer noch darüber stolpert - eine andere Problemumgehung besteht darin, vor dem Gruppieren über .astype (str) in string zu konvertieren. Das schont die NaNs.
quelle
sum
vona
ist hier eine Zeichenfolgenverkettung, keine numerische Summe. Dies "funktioniert" nur, weil 'b' aus unterschiedlichen Einträgen bestand. Sie müssen 'a' numerisch und 'b' string seinPandas> = 1.1
Ab Pandas 1.1 haben Sie eine bessere Kontrolle über dieses Verhalten. NA-Werte sind jetzt im Grouper zulässig, indem Sie
dropna=False
:Sie können die Vorabversion von Version 1.1 mit dem folgenden Befehl installieren:
quelle
Ich kann M. Kiewisch keinen Kommentar hinzufügen, da ich nicht genügend Reputationspunkte habe (nur 41, aber mehr als 50 zum Kommentieren).
Ich möchte nur darauf hinweisen, dass die M. Kiewisch-Lösung nicht wie sie ist funktioniert und möglicherweise weitere Anpassungen benötigt. Betrachten Sie zum Beispiel
Dies zeigt, dass für Gruppe b = 4.0 der entsprechende Wert 15 statt 6 ist. Hier werden nur 1 und 5 als Zeichenfolgen verkettet, anstatt sie als Zahlen hinzuzufügen.
quelle
b
SpalteEin kleiner Punkt zu Andy Haydens Lösung - es funktioniert nicht mehr (mehr?), Weil es
np.nan == np.nan
ergibtFalse
, also diereplace
Funktion eigentlich nichts.Was für mich funktioniert hat, war Folgendes:
(Zumindest ist das das Verhalten von Pandas 0.19.2. Es tut mir leid, es als andere Antwort hinzuzufügen, ich habe nicht genug Ruf, um einen Kommentar abzugeben.)
quelle
df['b'].fillna(-1)
.Alle bisher gegebenen Antworten führen zu potenziell gefährlichem Verhalten, da Sie möglicherweise einen Dummy-Wert auswählen, der tatsächlich Teil des Datensatzes ist. Dies wird immer wahrscheinlicher, wenn Sie Gruppen mit vielen Attributen erstellen. Einfach ausgedrückt, der Ansatz lässt sich nicht immer gut verallgemeinern.
Eine weniger hackige Lösung besteht darin, mit pd.drop_duplicates () einen eindeutigen Index von Wertekombinationen mit jeweils eigener ID zu erstellen und diese dann zu gruppieren. Es ist ausführlicher, erledigt aber die Arbeit:
Beachten Sie, dass Sie jetzt einfach Folgendes tun können:
Dadurch wird das erfolgreiche Ergebnis zurückgegeben, ohne dass Sie sich Gedanken über das Überschreiben realer Daten machen müssen, die als Dummy-Wert verwechselt werden.
quelle
Ich habe dies bereits beantwortet, aber aus irgendeinem Grund wurde die Antwort in einen Kommentar umgewandelt. Dies ist jedoch die effizienteste Lösung:
Es ist ziemlich erschwerend, NaNs nicht in Gruppen aufnehmen (und vermehren) zu können. Das Zitieren von R ist nicht überzeugend, da dieses Verhalten nicht mit vielen anderen Dingen übereinstimmt. Wie auch immer, der Dummy-Hack ist auch ziemlich schlecht. Die Größe (einschließlich NaNs) und die Anzahl (ignoriert NaNs) einer Gruppe unterscheiden sich jedoch, wenn NaNs vorhanden sind.
Wenn diese unterschiedlich sind, können Sie den Wert für das Ergebnis der Aggregationsfunktion für diese Gruppe auf Keine zurücksetzen.
quelle