2017-02-24 7 views
1

위의 행을 바탕으로 다음팬더는 아래 내가 같은 dataframe을

import pandas as pd 
data={'col1':[1,3,3,1,2,3,2,2, 1], 'col2':[np.nan, 1, np.nan, 1, np.nan, np.nan, np.nan, 2, np.nan]} 
df=pd.DataFrame(data,columns=['col1', 'col2']) 
print df 

    col1 col2 
0  1 NaN 
1  3 1.0 
2  3 NaN 
3  1 1.0 
4  2 NaN 
5  3 NaN 
6  2 NaN 
7  2 2.0 
8  1 NaN 

내가 col2의 값이 동일한 경우 col2에 알엇 NaN의 채우는 세 번째 열을 만들기 위해 노력하고 있습니다를 1.0 또는 위에있는 행 col21.0입니다. 마지막 dataframe은 다음과 같이 보일 것이다 : 나는 시도

col1 col2 col3 
0  1 NaN NaN 
1  3 1.0 1.0 
2  3 NaN 1.0 
3  1 1.0 1.0 
4  2 NaN 1.0 
5  3 NaN 1.0 
6  2 NaN 1.0 
7  2 2.0 2.0 
8  1 NaN NaN 

먼저 접근했다 :

col1 col2 col3 
0  1 NaN  0 
1  3 1.0  1 
2  3 NaN  1 
3  1 1.0  1 
4  2 NaN  1 
5  3 NaN  0 
6  2 NaN  0 
7  2 2.0  0 
8  1 NaN  0 

의 첫 번째 인스턴스를 해결합니다

df['col3'] = ((df['col2']== 1) | ((df['col2'].shift()== 1))).astype('int')

이이 dataframe 날 잎 누락 된 값은 채우지 만 계속 누락 된 값을 채우지는 않습니다. 나 또한 np.where() 함수를 사용하여 시도하고 동일한 결과를 얻을.

여러 인스턴스를 연속으로 수정하는 팬더에서이 방법을 쓸 수 있습니까?

답변

5

당신은 한 곳을 채우는 미래 채우기가 하나의 동일한 곳을보고 np.where을 사용할 수 있습니다 그건 사실이야, 그것이 거짓 때 'COL2'의 값으로 다시 떨어지는 :

df['col2'] = np.where(df['col2'].ffill() == 1, 1, df['col2']) 

결과 출력 :

col1 col2 
0  1 NaN 
1  3 1.0 
2  3 1.0 
3  1 1.0 
4  2 1.0 
5  3 1.0 
6  2 1.0 
7  2 2.0 
8  1 NaN 
0

이 같이 앞으로 패딩으로 df.fillna 기능을 사용할 수 있습니다 :

df.fillna(method='pad') 

    col1 col2 
0  1 NaN 
1  3 1.0 
2  3 1.0 
3  1 1.0 
4  2 1.0 
5  3 1.0 
6  2 1.0 
7  2 2.0 
8  1 2.0 
+1

col2가 1.0이거나 위의 행이 1.0 인 경우에만 값을 채우고 싶습니다. 위의 행이 2.0 인 누락 값도 제안 사항입니다. – jth359

+0

미안하지만 세부 사항을 놓쳤습니다. 다른 답변은 완벽하게 작동합니다. – shish023

2
ffilled = df.col2.ffill() 
df.assign(col3=df.col2.fillna(ffilled[ffilled == 1]))