Python 3.x 如果数据帧的第一列不匹配,则在第二列上联接

Python 3.x 如果数据帧的第一列不匹配,则在第二列上联接,python-3.x,pandas,dataframe,join,concat,Python 3.x,Pandas,Dataframe,Join,Concat,如果pandas数据帧(Python3.x)的第一列不匹配,我需要能够在第二列上进行匹配 前 表2 Name NickName Colour 0 James Jamie Blue 1 Tim Black 2 John Red 3 Emily Em Purple 查找 Name Pet 0 Tim Cat

如果pandas数据帧(Python3.x)的第一列不匹配,我需要能够在第二列上进行匹配

表2

        Name    NickName    Colour
0       James   Jamie        Blue
1       Tim                  Black
2       John    Red
3       Emily   Em           Purple
查找

    Name    Pet
0   Tim     Cat    
1   John    Dog
2   Em      Fox
3   Jamie   Dog
我需要的结果是:

    Name    NickName    Colour  Pet
0   James   Jamie       Blue    Dog
1   Tim                 Black   Cat
2   John                Red     Dog
3   Emily   Em          Purple  Fox
在名称列上匹配,如果不匹配,在昵称列上匹配, 我尝试了很多不同的方法,包括:

pd.merge(table_df,lookup_df, how='left', left_on='Name', right_on='Name')
if Nan -> pd.merge(table_df,lookup_df, how='left', left_on='NickName', right_on='Name')
但它并不能满足我的需要,我希望避免使用嵌套循环。 有人知道怎么做吗?非常感谢您的反馈


谢谢

您可以在
Name
map
NickName
fillna

s = lookup_df.set_index("Name")["Pet"]

table_df["pet"] = table_df["Name"].map(s).fillna(table_df["NickName"].map(s))

print (table_df)

    Name NickName  Colour  pet
0  James    Jamie    Blue  Dog
1    Tim            Black  Cat
2   John              Red  Dog
3  Emily       Em  Purple  Fox

只需执行两次
merge
,一次在
Namw
上,另一次在
昵称上
谢谢@叶亨利
s = lookup_df.set_index("Name")["Pet"]

table_df["pet"] = table_df["Name"].map(s).fillna(table_df["NickName"].map(s))

print (table_df)

    Name NickName  Colour  pet
0  James    Jamie    Blue  Dog
1    Tim            Black  Cat
2   John              Red  Dog
3  Emily       Em  Purple  Fox