2017-11-02 1 views
0

두 개의 데이터 프레임이 있는데 첫 번째 데이터 프레임의 특정 열을 조건부로 업데이트해야합니다. DF1의 식별자 칼럼 == '갑'이 I DF2로부터 대응하는 열이 열 DF1 D, E, F를 업데이트해야 다른 데이터 프레임에서 조건부로 업데이트 된 팬더

df1 = pd.DataFrame([[1,'Foo',1,1,1,np.nan,np.nan,np.nan],[2,'Foo',2,2,2,np.nan,np.nan,np.nan],[3,'Bar',3,3,3,np.nan,np.nan,np.nan]], columns = ['Key','identifier','A','B','C','D','E','F']) 

print df1 

    Key identifier A B C D E F 
0 1  Foo 1 1 1 NaN NaN NaN 
1 2  Foo 2 2 2 NaN NaN NaN 
2 3  Bar 3 3 3 NaN NaN NaN 

df2 = pd.DataFrame([[1,np.nan,10,10,10,5,6,7],[2,np.nan,12,12,12,8,9,10],[3,np.nan,13,13,13,11,12,13]], columns = ['Key','identifier','A','B','C','D','E','F']) 

print df2 

    Key identifier A B C D E F 
0 1   NaN 10 10 10 5 6 7 
1 2   NaN 12 12 12 8 9 10 
2 3   NaN 13 13 13 11 12 13 

. 조건부로 세 열을 어떻게 업데이트 할 수 있습니까?
df3 = #code here 

원하는 출력 :

df1 = pd.DataFrame([[1,'Foo',1,1,1,np.nan,np.nan,np.nan],[4,'Bar',4,4,4,np.nan,np.nan,np.nan],[2,'Foo',2,2,2,np.nan,np.nan,np.nan],[3,'Bar',3,3,3,np.nan,np.nan,np.nan]], columns = ['Key','identifier','A','B','C','D','E','F']) 

지금 DF1의 길이와 DF2 '그런가 :

print df3 

    Key identifier A B C D E  F 
0 1  Foo 1 1 1 5.0 6.0 7.0 
1 2  Foo 2 2 2 8.0 9.0 10.0 
2 3  Bar 3 3 3 NaN NaN NaN 

후속

말 대신, DF1은 다음을이었다 업데이트 할 레코드의 위치 지정과 일치하지 않습니다. 이 기능은 어떻게 계속 작동합니까? set_index와 인덱스에 Key을 설정 한 후,

df2[df1['identifier'] == 'Foo'].combine_first(df1) 

Key identifier  A  B  C  D  E  F 
0 1.0  Foo 10.0 10.0 10.0 5.0 6.0 7.0 
1 4.0  Bar 4.0 4.0 4.0 NaN NaN NaN 
2 3.0  Foo 13.0 13.0 13.0 11.0 12.0 13.0 
3 3.0  Bar 3.0 3.0 3.0 NaN NaN NaN 

답변

2

사용 combine_first : 나는 다음과 같은 출력을 얻을.

df1 

    identifier A B C D E F 
Key         
1   Foo 1 1 1 NaN NaN NaN 
2   Foo 2 2 2 NaN NaN NaN 
3   Bar 3 3 3 NaN NaN NaN 

df2 

    identifier A B C D E F 
Key          
1   NaN 10 10 10 5 6 7 
2   NaN 12 12 12 8 9 10 
3   NaN 13 13 13 11 12 13 

df2[df1.eval('identifier == "Foo"')].combine_first(df1) 

    identifier  A  B  C D E  F 
Key            
1   Foo 10.0 10.0 10.0 5.0 6.0 7.0 
2   Foo 12.0 12.0 12.0 8.0 9.0 10.0 
3   Bar 3.0 3.0 3.0 NaN NaN NaN 
+0

덕분에,이 올바른, 다음에 해당합니다? df2 [ 'identifier'] == 'Foo']. combine_first (df1) – flyingmeatball

+0

@flyingmeatball 그것은 그렇습니다. 나는 단지 귀여워지기를 원했다. –

+0

감사합니다. 후속 조치를 추가했습니다. df1에 4 개의 항목이 있고 df2에 3 개의 항목이 있고 올바른 순서로 있지 않은 경우 왜 계속 작동하는지 설명 할 수 있습니까? – flyingmeatball

관련 문제