【问题标题】:Merging dataframes, dropping column and set index合并数据框,删除列并设置索引
【发布时间】:2017-05-31 10:07:17
【问题描述】:

我有两个这样的数据框:

import pandas as pd

left = pd.DataFrame({'id1': ['a', 'b', 'c'], 'val1': [1, 2, 3]})
right = pd.DataFrame({'ID2': ['a', 'c', 'd'], 'val2': [4, 5, 6]})

  id1  val1
0   a     1
1   b     2
2   c     3

  ID2  val2
0   a     4
1   c     5
2   d     6

我想合并这两个数据框,进行内部合并,删除ID2,然后还使用id1 作为新索引。我想要的输出如下所示:

    val1  val2
id1            
a       1     4
c       3     5

我目前这样做如下:

res = pd.merge(left, right, left_on='id1', right_on='ID2', how='inner').drop('ID2', axis=1).set_index('id1')

这给了我想要的输出。

我的问题是是否已经有一个选项允许我

a) 在执行内部合并时删除一个键列,因为会有两个相同的列

和/或

b) 直接将索引设置为用于合并过程的键列之一。

我现在做的方式是要走的路还是有什么更聪明的/内置的?

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    请看速度比较...第一个答案,即使用合并的答案是最快的

    【讨论】:

      【解决方案2】:

      在三个解决方案中,“合并”解决方案运行速度最快:

      pd.merge(left.set_index('id1'), right.set_index('ID2'),left_index=True, right_index=True)
      

      【讨论】:

      • 这是公认的答案,还是我遗漏了什么?!您介意添加速度比较吗?
      • 是的,您是对的,所有三个答案都可以正常工作,但我告诉您使用“合并”提供的解决方案是最快的...请查看我在答案中附上的图片...请原谅如果我表达得不够清楚
      【解决方案3】:

      您可以将merge 与参数left_indexright_index 一起使用(how='inner' 被省略,因为默认值)但在set_index 两个df 中首先使用set_index

      res = pd.merge(left.set_index('id1'), 
                     right.set_index('ID2'), 
                     left_index=True, 
                     right_index=True)
      print (res)
         val1  val2
      a     1     4
      c     3     5
      

      concat 的解决方案,需要为inner 加入参数join

      res = pd.concat([left.set_index('id1'), 
                       right.set_index('ID2')], axis=1, join='inner')
      print (res)
         val1  val2
      a     1     4
      c     3     5
      

      【讨论】:

        【解决方案4】:

        一种选择是在加入之前将键列设置为索引,这将只保留一个键列作为结果中的索引:

        left.set_index("id1").join(right.set_index("ID2"), how = "inner")
        

        【讨论】:

          猜你喜欢
          • 2020-08-16
          • 1970-01-01
          • 2021-03-08
          • 2011-11-18
          • 2015-10-28
          • 2018-12-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-02
          相关资源
          最近更新 更多