在2个数据帧中执行合并

时间:2017-04-25 19:12:08

标签: python pandas dataframe

我有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,在第二个数据帧上是k,结果是:

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

3 个答案:

答案 0 :(得分:4)

选项1

  • 使用dictzip
  • 构建地图字典
  • applymap与字典的get方法
  • 一起使用
  • 使用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惯用法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

答案 1 :(得分:3)

您可以使用Series创建的k map使用set_index,必填列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 必须是唯一的:

where FacWideAU IS NULL 
   or FacWideAU = 1 
   or FacWideAR IS NULL
   or FacWideAR = 1 
   or AU IS NULLor AU = 1

答案 2 :(得分:2)

这是一种方法,使用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