42567


以下のような２つのデータフレームがあり、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()を使いたくありません。  
うまい実現方法はないでしょうか？


CC BY-SA 3.0
2018-03-22T05:16:19.070
42564
2018-03-22T06:02:51.590
27817
question
python pandas
python pandas 2つのcsvの共通の列の値を使って結合したい


こんな感じでどうでしょうか？

[code]

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame({'id':[1,2,3,4,105],
                        'value': ['A','B',np.nan,np.nan,'A']})
    df2 = pd.DataFrame({'value': ['A','B','C','D'],
                        'param1':['df2-1','df2-2','df2-3','df2-4'],
                        'param2':['value-1','value-2','value-3','value-4']})
    df3 = pd.DataFrame({'id':[1,2,3,5],
                        'param1':['id-1','id-2','id-3','id-5'],
                        'param2':['df3-1','df3-2','df3-3','df3-5']})
    
    ret = df1.merge(df2, on='value', how='left').combine_first(df1.merge(df3, 
    on='id'))
    print(ret)
    #    id value param1   param2
    #0    1     A  df2-1  value-1
    #1    2     B  df2-2  value-2
    #2    3   NaN   id-3    df3-3
    #3    4   NaN    NaN      NaN
    #4  105     A  df2-1  value-1
    
[/code]


CC BY-SA 3.0
2018-03-22T06:02:51.590
42567
2018-03-22T06:02:51.590
24801
42564
answer