2016-11-17 4 views
3

Einige DataFrame- und Series-Methoden haben den Methodenparameter. Zum Beispiel:Wie definiert man einen eigenen Parameter fill in Pandas (Python)?

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs) 

und der Verfahrensparameter kann die folgenden Werte annehmen: {None, 'Verfüllung'/'bfill', 'pad'/'ffill', 'nächste'}

Allerdings bin ich d wie zu def eine Art Fill-in-Funktion, die wiederum definieren würde, wie die Lücken unter Verwendung der bereits in der Serie vorhandenen Werte zu füllen, so dass es auf folgende Weise verwendet werden könnte:

df = DataFrame.fillna(method='new_method') 
+0

Können Sie genau erklären, was Sie wollen? Von dem, was ich verstehe, klingt es so, als müssten Sie die 'fillna'-Methode affektieren oder den Quellcode modifizieren, da der Parameter' method' keine beliebige Funktion akzeptiert. –

+0

@ juanpa.arrivillaga yeah Ich denke, der richtige Weg zu gehen wäre, den Quellcode zu ändern. Nun, z.B. Ich möchte eine Funktion, die die Lücken mit dem Durchschnitt der nächsten Werte in der Serie füllen würde. Ich meine so etwas: 1 NaN 3 -> 1 2 3. – weeCoder

+1

Gibt es einen Grund, warum Sie es mit der 'fillna'-Methode verwenden können? Es wäre wahrscheinlich besser, eine eigene Funktion zu schreiben und den Quellcode allein zu lassen. –

Antwort

0

In Ihrem sehr spezifische Fall (Mittelwert der nächsten Werte), können Sie dies tun:

import pandas as pd 
import numpy as np 

col1 = np.array([0, 1, np.nan, 4]) 
col2 = np.array([0, np.nan, 2, 5]) 

df = pd.DataFrame({"col1" : col1, "col2" : col2}) 

# Trick: average forward and backward fill 
df = 0.5 * (df.fillna(method="bfill") + df.fillna(method="ffill")) 

Durch die Rückwärts- und Vorwärts fill durchschnittlich, werden Sie den Durchschnitt erhalten, während alle anderen Werte zu halten (aber für Rundungsfehler) unverändert . Aber es wird natürlich nicht für die erste und letzte Reihe funktionieren. (Aber dann können Sie ffill und füllen Sie noch einmal, wenn das akzeptabel ist)

+0

in Wahrheit, es war eher eine Kuriositätsfrage als alles andere. Ich möchte nur wissen, ob es möglich ist, etwas * neu zu definieren *, um einen benutzerdefinierten Methodenparameter zu setzen. Ich weiß, dass es fast immer möglich ist, einen Workaround zu finden, der den Zweck erfüllt. – weeCoder

Verwandte Themen