2016-06-29 22 views
2

Ich habe einen Datenrahmen:Pandas füllen Zellen in einer Spalte mit NaN Werten leiten den Wert von anderen Zellen in der Reihe

 a b  c 
0 1 2  3 
1 1 1  1 
2 3 7  NaN 
3 2 3  5 
... 

I Spalte „drei“ Inplace füllen wollen (die Werte aktualisieren), wo die Werte sind NaN unter Verwendung eines maschinellen Lernalgorithmus.

Ich weiß nicht, wie es inplace. Beispielcode:

import pandas as pd 
import numpy as np 
from sklearn.linear_model import LinearRegression 
df=pd.DataFrame([range(3), [1, 5, np.NaN], [2, 2, np.NaN], [4,5,9], [2,5,7]],columns=['a','b','c']) 
x=[] 
y=[] 
for row in df.iterrows(): 
    index,data = row 
    if(not pd.isnull(data['c'])): 
     x.append(data[['a','b']].tolist()) 
     y.append(data['c']) 

model = LinearRegression() 
model.fit(x,y) 

#this line does not do it in place. 
df[~df.c.notnull()].assign(c = lambda x:model.predict(x[['a','b']])) 

Aber das gibt mir eine Kopie des Datenrahmens. Die einzige Option, die ich noch habe, ist eine for-Schleife, aber das möchte ich nicht tun. Ich denke, es sollte mehr pythonischer Weg sein, es mit Pandas zu machen. Kann mir bitte jemand helfen? Oder gibt es einen anderen Weg, dies zu tun?

Antwort

1

Sie werden wie etwas zu tun haben:

df.loc[pd.isnull(df['three']), 'three'] = _result of model_

Diese direkt Datenrahmen modifiziert df

So können Sie zuerst die Datenrahmen filtern, um die Scheibe Sie ändern möchten zu halten (pd.isnull(df['three'])), Wählen Sie dann aus dieser Schicht die Spalte aus, die Sie ändern möchten (three).

Auf der rechten Seite des Gleichheits, sie erwartet ein Array/Liste/Serie mit der gleichen Anzahl von Zeilen als die gefilterten Datenrahmen (in Ihrem Beispiel eine Zeile) zu erhalten

Sie müssen möglicherweise neu einstellen je nachdem, was Ihr Modell

pred = model.predict(df[['a', 'b']]) 
df['pred'] = model.predict(df[['a', 'b']]) 
df.loc[pd.isnull(df['c']), 'c'] = df.loc[pd.isnull(df['c']), 'pred'] 

Beachten Sie, dass eine signi wie diese genau kehrt

EDIT

Sie stg wahrscheinlich tun müssen, Der entscheidende Teil des Problems kommt von der Art und Weise, wie Sie scikit learn in Ihrem Beispiel verwenden. Sie müssen das gesamte Dataset an das Modell übergeben, wenn Sie es vorhersagen.

+0

model.predict gibt eine ganze Zahl zurück. Das Problem ist vorhersagen nimmt die Werte in den anderen Zellen der Reihe, die ich nicht herausfinden kann, wie man gibt. Ich habe versucht, was Sie vorgeschlagen, aber es hat nicht funktioniert: 'df.loc [~ df.three.notnull() und ++ i> 0, 'drei'] = model.predict (df.iloc [[i]] [['eins', 'zwei']]. values.tolist() [1]) 'Können Sie bitte helfen und die Lösung geben? – harshit

+0

'nicht funktioniert' ist nicht sehr genau. Kannst du die Frage auch bearbeiten, um mehr Informationen über 'model.predict' hinzuzufügen? Reproduzierbarer Code wird benötigt, um tiefer zu gehen. – knightofni

+0

aktualisiert mit Beispielcode – harshit