在2个数据范围内执行合并



我有2个数据框:

Dataframe1:
i   j
3   4
5   6
7   2
Dataframe2:
k   n
1   a
2   b
3   c
4   d
5   e
6   f
7   g
8   h

我如何合并这两个数据范围,以使关键元素在拳头数据框架和第二个数据框架上同时是i和j,因此结果是:

Dataframe1:
i   j   ni   nj
3   4   c   d
5   6   e   f
7   2   g   b

选项1

  • 使用dictzip
  • 构建映射字典
  • 与字典的get方法一起使用applymap
  • 使用add_prefix在前面获取'n'
  • 使用join合并

m = dict(zip(d2.k.values, d2.n.values))
d1.join(d1.applymap(m.get).add_prefix('n'))
   i  j ni nj
0  3  4  c  d
1  5  6  e  f
2  7  2  g  b

等效1线

d1.join(d1.applymap(dict(zip(d2.k.values, d2.n.values)).get).add_prefix('n'))
   i  j ni nj
0  3  4  c  d
1  5  6  e  f
2  7  2  g  b

选项2
与选项1相同,除了我们可以使用stack/unstack IDIOM使用map

m = dict(zip(d2.k.values, d2.n.values))
d1.join(d1.stack().map(m).unstack().add_prefix('n'))
   i  j ni nj
0  3  4  c  d
1  5  6  e  f
2  7  2  g  b

您可以使用Series使用set_index创建的map,这也是必要的列k必须是唯一的:

s = df2.set_index('k')['n']
df1['ni'] = df1['i'].map(s)
df1['nj'] = df1['j'].map(s)
print (df1)
   i  j ni nj
0  3  4  c  d
1  5  6  e  f
2  7  2  g  b

这是一种方法,使用unstackmergepivot

df3 = (df1.unstack('j')
          .reset_index()
          .rename(columns={0:'k'})
          .merge(df2, on="k")
          .pivot(index='level_1', columns='level_0'))
df3.columns = ['{}{}'.format(a,b) if a == 'n' else b for a,b in df3.columns]
df3.set_index(['i','j'], inplace=True)
    ni nj
i j      
3 4  c  d
5 6  e  f
7 2  g  b

最新更新