Python 合并数据帧、删除列和设置索引

Python 合并数据帧、删除列和设置索引,python,pandas,merge,Python,Pandas,Merge,我有两个这样的数据帧: 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

我有两个这样的数据帧:

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
    val1  val2
id1            
a       1     4
c       3     5
我想合并这两个数据帧,进行内部合并,删除
ID2
,然后还使用
id1
作为新索引。我想要的输出如下所示:

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
    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) 直接将索引设置为合并过程中使用的键列之一


我现在的做法是正确的,还是已经有了更聪明的/a内置方法?

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

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

您可以与参数
左索引
右索引
一起使用(
how='internal'
由于默认值而被省略),但在这两个
df
中都是第一个:

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
对于
internal
join,有必要添加参数
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

在提供的三种解决方案中,“合并”解决方案运行最快:

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


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

这是公认的答案,还是我遗漏了什么?!你介意添加速度比较吗?是的,你是对的,所有三个答案都很好,但我告诉你,使用“合并”提供的解决方案是最快的…请查看我在答案中附加的图片…如果我不够清晰,请原谅