Ich möchte N/A Werte in einem DataFrame in einer selektiven Weise füllen. Insbesondere wenn es eine Folge von konsekutiven Nans innerhalb einer Spalte gibt, möchte ich, dass sie mit dem vorhergehenden Nicht-Nan-Wert gefüllt werden, aber nur dann, wenn die Länge der Nan-Sequenz unter einem spezifizierten Schwellenwert liegt. Wenn der Schwellenwert beispielsweise 3 ist, wird eine Sequenz innerhalb der Spalte von 3 oder weniger mit dem vorhergehenden Nicht-Nan-Wert gefüllt, während eine Sequenz von 4 oder mehr Nans unverändert bleibt.Verwendung von fillna() selektiv in Pandas
Das heißt, wenn der Eingangsdatenrahmen
2 5 4
nan nan nan
nan nan nan
5 nan nan
9 3 nan
7 9 1
I ist der Ausgang sein will:
2 5 4
2 5 nan
2 5 nan
5 5 nan
9 3 nan
7 9 1
Die fillna
Funktion, wenn sie an einen Datenrahmen angewandt wird, hat die Methode und Limit-Optionen. Aber diese reichen leider nicht aus, um die Aufgabe zu erfüllen. Ich habe versucht, method='ffill'
und limit=3
anzugeben, aber das füllt die ersten 3 Nans einer Sequenz, nicht selektiv wie oben beschrieben.
Ich nehme an, dies, indem Sie Spalte für Spalte mit einigen bedingten Anweisungen codiert werden kann, aber ich vermute, es muss etwas mehr Pythonic sein. Irgendwelche Vorschläge auf eine effiziente Art, dies zu erreichen?
Vielen Dank @DSM. Das ist eine sehr schöne Lösung, die uns tatsächlich das gibt, wonach wir suchen. Nur ein Kommentar: Es ist ziemlich langsam. Ich habe es mit einem Limit von 3 für einen DataFrame der Größe 530x11500 verwendet und es dauerte ungefähr 32 Sekunden. So, während diese Lösung groß ist, würde eine alternative Lösung, die die Laufzeit verringert, sehr geschätzt werden – splinter
Viel schnell tatsächlich! Wandzeit: 9.01 s – splinter