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