通过比较值合并多个pandas数据框中的选定列

时间:2017-10-09 12:55:52

标签: python pandas dataframe

我的 df1 如下:

id
1
2
3
4
5
6
7

我有 df2

id1 name1 val1
1   abbb1  10
2   abbb2  20
3   abbb3  30
4   abbb4  40
7   abbb7  70

我的 df3 为:

id2 name2 val2
1   abbb1  90
2   abbb2  20
5   abbb5  50
6   abbb6  60

所以,我想从 df2 df3 中选择值,通过匹配ID将其添加到df1。所以,df1应如下所示:

id  val1 val2
1   10   90
2   20   20
3   30   0
4   40   0
5   0    40
6   0    60
7   70   0

我所到达的只是这行代码,我卡住了:

df1 = df1.merge(df2, df3, on=['id'])

请注意:

  • 我不想在预期的输出中使用name1和name2。
  • 如果val1或val2不存在(比较后),我想要单元格 包含0。

1 个答案:

答案 0 :(得分:1)

我认为最好使用map

id1id2df2df3的唯一值也是必需的。

df1['val1'] = df1['id'].map(df2.set_index('id1')['val1']).fillna(0).astype(int)
df1['val2'] = df1['id'].map(df3.set_index('id2')['val2']).fillna(0).astype(int)
print (df1)
   id  val1  val2
0   1    10    90
1   2    20    20
2   3    30     0
3   4    40     0
4   5     0    50
5   6     0    60
6   7    70     0

替代:

a = df1['id'].map(df2.set_index('id1')['val1']).fillna(0).astype(int)
b = df1['id'].map(df3.set_index('id2')['val2']).fillna(0).astype(int)
df1 = df1.assign(val1=a, val2=b)
print (df1)
   id  val1  val2
0   1    10    90
1   2    20    20
2   3    30     0
3   4    40     0
4   5     0    50
5   6     0    60
6   7    70     0

merge的解决方案:

df1 = df1.merge(pd.merge(df2.rename(columns={'id1':'id'}), 
                         df3.rename(columns={'id2':'id'}), on='id', how='outer')
                [['id','val1','val2']].fillna(0).astype(int), how='left')
print (df1)
   id  val1  val2
0   1    10    90
1   2    20    20
2   3    30     0
3   4    40     0
4   5     0    50
5   6     0    60
6   7    70     0