2

私はデータフレームを持っています:

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

機械学習アルゴリズムを使用して、値が NaN である列「3」をその場で入力 (値を更新) したいと考えています。

その場で行う方法がわかりません。サンプルコード:

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 ループを使用することですが、私はそれをしたくありません。パンダを使用してそれを行うには、もっとpythonicな方法があるはずだと思います。誰か助けてくれませんか?または、これを行う他の方法はありますか?

4

2 に答える 2

1

次のようなことをする必要があります:

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

これはデータフレームを直接変更しますdf

このようにして、最初にデータフレームをフィルタリングして、変更するスライスを保持し ( pd.isnull(df['three']))、そのスライスから変更する列を選択します ( three)。

等しいの右側では、フィルター処理されたデータフレームと同じ行数の配列/リスト/シリーズを取得することが期待されます(この例では、1行)

モデルが正確に返すものに応じて調整する必要がある場合があります

編集

おそらく、このように stg を実行する必要があります

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

問題の大部分は、例で scikit Learn を使用している方法に起因することに注意してください。予測するときは、データセット全体をモデルに渡す必要があります。

于 2016-06-29T02:08:48.890 に答える