2017-10-09 81 views
1

我有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 

因此,我想从df2df3中挑选值,通过匹配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']) 

请注意:

  • 我不t希望在预期的输出中包含name1和name2。
  • 如果VAL1 VAL2或不存在(比较后),我想细胞 包含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 
+0

地图是一个聪明的想法。因为合并声明开始变得与我真正的查询变得复杂。谢谢! – kingmakerking