Python 通过比较值合并多个数据帧中的选定列
我有如下df1:Python 通过比较值合并多个数据帧中的选定列,python,pandas,dataframe,Python,Pandas,Dataframe,我有如下df1: id 1 2 3 4 5 6 7 id val1 val2 1 10 90 2 20 20 3 30 0 4 40 0 5 0 40 6 0 60 7 70 0 我有df2作为: id1 name1 val1 1 abbb1 10 2 abbb2 20 3 abbb3 30 4 abbb4 40 7 abbb7 70 id2 name2 val2 1 abbb1 90 2
id
1
2
3
4
5
6
7
id val1 val2
1 10 90
2 20 20
3 30 0
4 40 0
5 0 40
6 0 60
7 70 0
我有df2作为:
id1 name1 val1
1 abbb1 10
2 abbb2 20
3 abbb3 30
4 abbb4 40
7 abbb7 70
id2 name2 val2
1 abbb1 90
2 abbb2 20
5 abbb5 50
6 abbb6 60
我有df3作为:
id1 name1 val1
1 abbb1 10
2 abbb2 20
3 abbb3 30
4 abbb4 40
7 abbb7 70
id2 name2 val2
1 abbb1 90
2 abbb2 20
5 abbb5 50
6 abbb6 60
因此,我想从df2和df3中选取值,通过匹配ID将其添加到df1中。因此,df1应如下所示:
id
1
2
3
4
5
6
7
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
- 我认为这里更好用
在
df2
和df3
中,id1
和id2
的唯一值也是必需的
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语句开始使我的实际查询变得复杂。谢谢