以下のような2つのデータフレームがあり、new_dfのようにしたいです。
idはインデックスではありません。

[df1]
id,value
1,A
2,B
3,NaN
4,NaN
105,A
...

[df2]
value,param1,param2
A,df2-1,Value-1
B,Df2-2,VAlue-2
C,dF2-3,valUE-3
D,DF2-4,valuE-4
...

[df3]
id,param1,param2
1,id-1,DF3-1
2,Id-2,Df3-2
3,iD-3,dF3-3
5,ID-5,df3-5
...

↓ ↓ ↓

[new_df]
id,value,param1
1,A,df2-1,Value-1
2,B,Df2-2,VAlue-2
3,iD-3,dF3-3
4,NaN,NaN,NAN
105,A,df2-1,Value-1
...

df1でvalueがあればdf2のvalueに該当するparam1,param2を、
df1でvalueがなければdf3のidに該当するparam1,param2を、
df1でvalueもidも該当するものがなければそのままにしておきたいです。

sqldfを使えば力業で出来るのは分かっているのですが、そのためにfor ...iterrows()を使いたくありません。
うまい実現方法はないでしょうか?