我有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
答案 0 :(得分:4)
选项1
dict
和zip
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)
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