2017-11-02 29 views
0

私は2つのデータフレームを持っており、最初のデータフレームの特定の列を条件付きで更新する必要があります。別のデータフレームから条件付きで更新されたパンダ

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 

場合DF1における識別子です列== 'foo' で、IはDF2からの対応する列とDF1列D、E、Fを更新する必要があります。条件付きで3つの列を更新するにはどうすればよいですか?

df3 = #code here 

所望の出力:

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は、次のようだったと言う:

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は」上がりません同じであり、更新されるレコードの位置が一致しません。これはどういう仕組みですか?​​とインデックスに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 [df1 ['識別子'] == 'Foo']。combine_first(df1) – flyingmeatball

+0

@flyingmeatballそうです。私はただかわいくなりたかった。 –

+0

ありがとうございました - フォローアップを追加しました。なぜdf1に4つのアイテムがあり、df2に3つのアイテムがあり、正しい順序でない場合、これがなぜ機能するのか説明できますか? – flyingmeatball

関連する問題