팬더

2016-06-29 9 views
2

I는 dataframe있는 행에 다른 셀의 값을 도출하는 NaN 값 열의 셀을 채우팬더

I 열 충전 할
 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

당신은 같은 것을해야 할 것이다 : 이것은 df

당신이 먼저 (pd.isnull(df['three']))을 수정할 슬라이스를 유지하기 위해 dataframe를 필터링이 방법을 직접 dataframe 수정

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

을, 그런 다음 해당 슬라이스에서 수정할 열을 선택합니다 (three). 등호의 오른쪽에

, 그것은 (한줄하여 예에서) 필터 dataframe보다 선의 수가 같은 배열/목록/시리즈를 얻을 것으로 기대

조정할 필요가있다 모델 정확히 반환 내용에 따라

편집

당신은 아마 유의 그이

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을 할 필요가

문제의 중대한 부분은 scikit을 사용하는 방식에서 얻습니다. 예측할 때 전체 데이터 세트를 모델에 전달해야합니다.

+0

model.predict는 정수를 반환합니다. 문제는 예측하는 것이 행의 다른 셀에서 값을 가져 오는 방법을 알아낼 수 없다는 것입니다. 나는 당신이 제안한 것을 시도했지만 작동하지 않았다 :'df.loc [~ df.three.notnull() and ++ i> 0, 'three'] = model.predict (df.iloc [[i]] [[ ''one ','two ']]. values.tolist() [1])'도와 주시겠습니까? – harshit

+0

'didnt work'는별로 정확하지 않습니다. 또한'model.predict'에 대한 더 많은 정보를 추가하기 위해 질문을 편집 할 수 있습니까? 더 많은 정보를 얻으려면 재현 할 수있는 코드가 필요합니다. – knightofni

+0

샘플 코드 – harshit