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 的数据帧的两列的值并获取每个元素的计数?

如何在 Pandas 中连接包含列表(系列)的两列

Excel宏比较两个工作表中的两列并插入行值

比较来自两个不同表的两列的逗号分隔值

Pandas - 在两列中查找具有匹配值的行并在另一列中相乘

合并最近的追溯时间戳并在 pandas 中填充