Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过比较值合并多个数据帧中的选定列_Python_Pandas_Dataframe - Fatal编程技术网

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

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

我有如下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   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
因此,我想从df2df3中选取值,通过匹配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语句开始使我的实际查询变得复杂。谢谢