如何加入/合并数据集?

时间:2017-04-20 18:34:25

标签: python pandas dataframe merge

我有两个数据帧DF1DF2。我的目标是使用DF2列查找DF1 键;并将结果保存为DF3中的结果。有人可以帮助我获得 DF3

e.g。

DF1                         DF2
map test1   test2           No.     outcome
A   NaN     NaN             1       AA
B   NaN     5               2       BB
C   1       6               3       CC
D   2       7               4       DD
E   3       NaN             5       EE
F   4       NaN             6       FF
G   5       8               7       GG
H   6       9               8       HH
I   7       10              9       II
                            10      JJ
                            11      KK
                            12      LL
                            13      MM

DF3
map test1   test2   outcome1        outcome2
A   NaN     NaN     NaN             NaN
B   NaN     5       NaN             EE
C   1       6       AA              FF
D   2       7       BB              GG
E   3       NaN     CC              NaN
F   4       NaN     DD              NaN
G   5       8       EE              HH
H   6       9       FF              II
I   7       10      GG              JJ

我目前正在使用两个连接函数,但这不是我需要的。它会在NaN中删除DF1,并仅返回test1test2的重叠。

df3 = df1.merge(df2, how='inner', left_on='test1', right_on='No.')
df3 = df3.merge(df2, how='inner', left_on='test2', right_on='No.')

目前我的代码将返回此内容:

DF3
map test1 test2 outcome1 outcome2 C 1 6 AA FF D 2 7 BB GG G 5 8 EE HH H 6 9 FF II I 7 10 GG JJ

2 个答案:

答案 0 :(得分:1)

你喜欢高尔夫球吗?

pd.merge(pd.merge(df1, df2, how='left',left_on='test1',right_on='No.'),df2, how='left',left_on='test2',right_on='No.').drop(['No._x','No._y'], axis=1).rename(columns={'outcome_x':'outcome1','outcome_y':'outcome2'})

  map  test1  test2 outcome1 outcome2
0   A    NaN    NaN      NaN      NaN
1   B    NaN    5.0      NaN       EE
2   C    1.0    6.0       AA       FF
3   D    2.0    7.0       BB       GG
4   E    3.0    NaN       CC      NaN
5   F    4.0    NaN       DD      NaN
6   G    5.0    8.0       EE       HH
7   H    6.0    9.0       FF       II
8   I    7.0   10.0       GG       JJ

答案 1 :(得分:1)

在这种情况下,地图会更有效

DF3 = DF1.copy()
DF3['outcome1'] = DF1['test1'].map(DF2.set_index('No.')['outcome'])
DF3['outcome2'] = DF1['test2'].map(DF2.set_index('No.')['outcome'])

    map test1   test2   outcome1    outcome2
0   A   NaN     NaN     NaN         NaN
1   B   NaN     5.0     NaN         EE
2   C   1.0     6.0     AA          FF
3   D   2.0     7.0     BB          GG
4   E   3.0     NaN     CC          NaN
5   F   4.0     NaN     DD          NaN
6   G   5.0     8.0     EE          HH
7   H   6.0     9.0     FF          II
8   I   7.0     10.0    GG          JJ