2016-03-23 14 views
-1

Angesichts der folgenden Datenrahmen:Pandas Füllen NaN mit Spaltenwerte

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A':[1,1,np.nan], 
        'B':[2.2,np.nan,2.2]})   
df 

    A  B 
0 1.0  2.2 
1 1.0  NaN 
2 NaN  2.2 

Wenn ich den NaN Wert in Spalte A mit dem Wert ersetzt werden soll, die in dieser Spalte wiederholt (1) und das gleiche für Spalte B, welche Art von fillna() muss ich verwenden?

A  B 
0 1.0  2.2 
1 1.0  NaN 
2 NaN  2.2 

der Suche nach einer generischen Lösung, wie ich wirklich Tausende von Zeilen haben. Vielen Dank im Voraus!

Antwort

2

Warum nicht einfach:

df.fillna(method='ffill') 

# df = pd.DataFrame({'A': [1, 1, np.nan, 2], 'B': [2.2, np.nan, 2.2, 1.9]}) 
# df.fillna(method='ffill') 
# A B 
#0 1 2.2 
#1 1 2.2 
#2 1 2.2 
#3 2 1.9 
+0

Es ist aus dem OP nicht klar, ob der Füllwert nur der vorherige oder der gebräuchlichste Wert in der Spalte sein sollte. –

+0

hum ich habe es als den vorherigen Wert verstanden, aber Sie können Recht haben. –

+0

Von meinem Beispiel ist dies die Art von einfacher Antwort, die ich suchte. Was aber, wenn ich mit dem gebräuchlichsten Wert füllen wollte? Ich versuche schließlich, Leerzeichen aus einer df.loc und groupby-Transformation-Prozedur zu füllen, die einige Zeilenwerte leer lassen –

2

fillna kann Wörterbuch der Werte nehmen, wo der Schlüssel der Spaltenname ist.

Angenommen, Sie die Spalten mit dem Wert gefüllt werden soll, die am meisten wiederholt wird, können Sie das Wörterbuch berechnen mit:

df = pd.DataFrame({ 
    'A': [1, 1, np.nan, 2], 
    'B': [2.2, np.nan, 2.2, 1.9] 
}) 
fill_dict = df.mode().to_dict(orient='records')[0] 
df = df.fillna(values=fill_dict) 
df 

    A B 
0 1 2.2 
1 1 2.2 
2 1 2.2 
3 2 1.9 
0
import itertools 
import operator 

def most_common(L): 
    # get an iterable of (item, iterable) pairs 
    SL = sorted((x, i) for i, x in enumerate(L)) 
    # print 'SL:', SL 
    groups = itertools.groupby(SL, key=operator.itemgetter(0)) 
    # auxiliary function to get "quality" for an item 
    def _auxfun(g): 
    item, iterable = g 
    count = 0 
    min_index = len(L) 
    for _, where in iterable: 
     count += 1 
     min_index = min(min_index, where) 
    # print 'item %r, count %r, minind %r' % (item, count, min_index) 
    return count, -min_index 
    # pick the highest-count/earliest item 
    return max(groups, key=_auxfun)[0] 

und fügen Sie dann nur

df['A'].fillna(most_common(df['A'].values.tolist())) 
+0

Ich bin beeindruckt mit Ihre Implementierung von 'mode' mit itertools. Aber selbst wenn wir für einen Moment vergessen würden, dass Pandas-Datenrahmen ihre eigene "Modus" -Methode haben, wäre die Verwendung der numpy-Modus-Funktion sicherlich viel zuverlässiger. –

+0

Ja, ich stimme zu ... Ich habe gerade den Modus vergessen, also habe ich das getan ... Ich weiß nicht, ob es korrekt ans ist oder nicht !!!! –

Verwandte Themen