如果 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】:
您可以在Name
上map
和fillna
在NickName
上:
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 数据框的第一列不匹配,则加入第二列的主要内容,如果未能解决你的问题,请参考以下文章