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

时间:2017-01-16 14:25:25

标签: 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
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)直接将索引设置为用于合并过程的其中一个关键列。

我现在的方式是现在的方式还是有更聪明/内置的东西吗?

4 个答案:

答案 0 :(得分:3)

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

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

enter image description here

答案 1 :(得分:2)

您可以使用merge参数left_indexright_index,(how='inner'省略,因为默认值),但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 }:

join

使用set_index的解决方案,必须为inner加入添加参数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

ScheduledExecutorService

答案 2 :(得分:0)

在三种解决方案中,“合并”解决方案最快:

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

答案 3 :(得分:0)

Speed Comparison

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