2016-06-29 7 views
2

の他のセルから値を導出する、NaN値と列のセルを埋める:パンダは、私がデータフレームを持っている行

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

私はここ列「三」インプレース(値を更新)を充填します値は機械学習アルゴリズムを使用するNaNです。

私はそれをどのように行うのか分かりません。サンプルコード:

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']])) 

しかし、これは私にデータフレームのコピーを与えます。私は残したオプションだけforループを使用していますが、私はそれをしたくありません。私はパンダを使ってそれをやるという、より多くのピッソニックな方法があるはずだと思います。誰かが助けてくれますか?それともこれを行う方法は他にありますか?

答えて

1

あなたが好きな何かをする必要があります:これは、あなたが最初にあなたが(pd.isnull(df['three']))を変更したいスライスを維持するためにデータフレームをフィルタリングし、この方法df

直接データフレームを変更

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

、そのスライスから、変更する列を選択します(three)。

同等の右側に

、それは(、あなたの例では1行)で濾過データフレームよりも行数が同じ配列/リスト/シリーズを得ることを期待

あなたは調整する必要がありますあなたのモデルはおそらくsigniことをこの

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'] 

ノートのようなSTGを行う必要があり、正確

EDIT

を返すものに応じてあなたの例でscikitを学んでいる方法から、問題の有害な部分が生じます。予測するときは、データセット全体をモデルに渡す必要があります。

+0

model.predictは整数を返します。問題は、行の他のセルの値を取る予言で、私はどのように与えるか分かりません。あなたが提案したものを試しましたが、うまくいかなかった: 'df.loc [〜df.three.notnull()と++ i> 0、​​ 'three'] = model.predict(df.iloc [[i]] [['' one '、' two ']]。values.tolist()[1]) '助けて解決策を教えてもらえますか? – harshit

+0

'didnt work'はあまり正確ではありません。また、 'model.predict'についての情報を追加するために質問を編集できますか?より深く理解するためには、再現可能なコードが必要です。 – knightofni

+0

サンプルコード – harshit

関連する問題