如果 pandas 数据框的第一列不匹配,则加入第二列

Posted

技术标签:

【中文标题】如果 pandas 数据框的第一列不匹配,则加入第二列【英文标题】:Join on a second column if there is not a match on the first column of a pandas dataframe 【发布时间】:2021-01-30 15:05:51 【问题描述】:

如果 pandas 数据框 (Python 3.x) 的第一列不匹配,我需要能够匹配第二列。

例如


table_df = pd.DataFrame ( 
                    'Name': ['James','Tim','John','Emily'],
                    'NickName': ['Jamie','','','Em'],
                    'Colour': ['Blue','Black','Red','Purple']                          
                          )

lookup_df = pd.DataFrame ( 
                    'Name': ['Tim','John','Em','Jamie'],
                    'Pet': ['Cat','Dog','Fox','Dog']   
                    )

table_df

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

lookup_df

    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

在 Name 列上匹配,如果没有匹配到 Nickname 列, 我尝试了很多不同的方法,包括:

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')

但它不能满足我的需要,我想避免嵌套循环。 有没有人知道如何做到这一点?非常感谢任何反馈。

谢谢!

【问题讨论】:

只需执行两次merge,一次在Namw,另一次在NickName 【参考方案1】:

您可以在NamemapfillnaNickName 上:

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

【讨论】:

以上是关于如果 pandas 数据框的第一列不匹配,则加入第二列的主要内容,如果未能解决你的问题,请参考以下文章

加入 2 个数据框后命名多个 pandas 数据框的方法

R语言中怎么把第一列的数据作为行名

Pandas:按两列分组,将第一列组中的第一个值相加

使用多个数据框的第一行的第一个元素创建箱线图

Pandas:如果特定列不包含特定文本,则删除数据框中的行

减去 Pandas 或 Pyspark 数据框中的连续列