我有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
- 使用
dict
和zip
构建映射字典 - 与字典的
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
这是一种方法,使用unstack
,merge
和pivot
:
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