我的 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'])
请注意:
答案 0 :(得分:1)
我认为最好使用map
。
id1
和id2
中df2
和df3
的唯一值也是必需的。
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