2017-10-09 123 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