Pandas - 匹配来自两个数据帧的两列并在 df1 中创建新列
Posted
技术标签:
【中文标题】Pandas - 匹配来自两个数据帧的两列并在 df1 中创建新列【英文标题】:Pandas - match two columns from two data frames and create new column in df1 【发布时间】:2019-07-15 00:27:16 【问题描述】:我有两个数据框
df1
Srlno id image
1 3 image1.jpg
2 3 image2.jpg
3 3 image2.jpg
df2
Srlno id image
1 1 image1.jpg
2 2 image2.jpg
3 3 image3.jpg
我想根据列 Image 匹配两个数据框,并将 df2 中的 Id 作为新列返回到 df1。 df2 中的图像名称是唯一的,而 df1 中的图像名称有很多重复项。我想保留重复的图像名称,但为 df2 中的每个图像填写正确的 id。
预期的输出是:
Srlno id image newids
1 3 image1.jpg 1
2 3 image2.jpg 2
3 3 image2.jpg 2
我试过了
df1['newids'] = df1['image'].map(df2.set_index('image')['id'])
这会返回一个错误 InvalidInvexError('Reindexing only valid with uniquely valued index objects') 我知道 df1 中的重复项正在创建此错误...但不知道如何解决。
【问题讨论】:
【参考方案1】:dict(zip())
的另一种解决方案
df1['newids']=df1.image.map(dict(zip(df2.image,df2.id)))
print(df1)
Srlno id image newids
0 1 3 image1.jpg 1
1 2 3 image2.jpg 2
2 3 3 image2.jpg 2
【讨论】:
【参考方案2】:使用drop_duplicates
只为map
获取唯一的image
值:
#default keep first dupe
s = df2.drop_duplicates('image').set_index('image')['id']
df1['newids'] = df1['image'].map(s)
#keep last dupe
s = df2.drop_duplicates('image', keep='last').set_index('image')['id']
df1['newids'] = df1['image'].map(s)
#keep last dupe
d = dict(zip(df2['image'], df2['id']))
df1['newids'] = df1['image'].map(d)
【讨论】:
以上是关于Pandas - 匹配来自两个数据帧的两列并在 df1 中创建新列的主要内容,如果未能解决你的问题,请参考以下文章
我们如何组合来自相同 data_type 的数据帧的两列的值并获取每个元素的计数?