我有一个如下所示的 Pandas 数据框:
import pandas as pd
d = {'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1],
'B': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 11]}
df1 = pd.DataFrame(data=d)
df1
A B
0 1 11
1 2 12
2 3 13
3 4 14
4 5 15
5 6 16
6 7 17
7 8 18
8 9 19
9 10 20
10 1 11
和另一个看起来像这样的数据框:
import pandas as pd
d = {'C': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
'D': [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
'id': [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38 ,39, 40]}
df2 = pd.DataFrame(data=d)
df2
C D id
0 1 11 21
1 2 12 22
2 3 13 23
3 4 14 24
4 5 15 25
5 6 16 26
6 7 17 27
7 8 18 28
8 9 19 29
9 10 20 30
10 11 21 31
11 12 22 32
12 13 23 33
13 14 24 34
14 15 25 35
15 16 26 36
16 17 27 37
17 18 28 38
18 19 29 39
19 20 30 40
我想根据 id
和 df2
中的 df1
和 A
列加入从 B
到 df1
的 C
列D
中的 {1}} 和 df2
列,如下所示:
A B id
0 1 11 21
1 2 12 22
2 3 13 23
3 4 14 24
4 5 15 25
5 6 16 26
6 7 17 27
7 8 18 28
8 9 19 29
9 10 20 30
10 1 11 21
我希望我可以通过运行下面的代码来实现这一点。但是,正如预期的那样,它给了我一个 KeyError: 'C'
。有没有更优雅的方法来实现这一目标?
df_merge = pd.merge(df1, df2['id'], left_on=['A', 'B'], right_on=['C', 'D'], how='left')
答案 0 :(得分:1)
在列表中选择带有 id
的必要列并使用 rename
:
d= {'C':'A','D':'B'}
df_merge = pd.merge(df1, df2[['id', 'C', 'D']].rename(columns=d), on=['A', 'B'], how='left')
在您的解决方案中使用列表,然后删除列 C, D
:
df_merge = (pd.merge(df1, df2[['id', 'C', 'D']],
left_on=['A', 'B'], right_on=['C', 'D'], how='left')
.drop(['C','D'], axis=1))