本文将介绍以下主题:
不同条件下的索引合并基于索引的联接的选项:合并、联接、连接合并索引合并一个索引,另一个列有效使用命名索引简化合并语法
回到顶部
基于索引的联接
TL;博士
有几个选项,有些比其他选项更简单,具体取决于用途案例使用left_index和right_index的DataFrame.merge(或使用命名索引的left_on和right_on)支持内部/左侧/右侧/完整一次只能加入两个支持列列、索引列、索引索引联接DataFrame.join(加入索引)支持内部/左侧(默认)/右侧/完整一次可以连接多个DataFrame支持索引索引联接pd.concat(索引上的联接)支持内部/完整(默认)一次可以连接多个DataFrame支持索引索引联接
索引到索引联接
设置和基础知识
import pandas as pd
import numpy as np
np.random.seed([3, 14])
left = pd.DataFrame(data={'value': np.random.randn(4)},
index=['A', 'B', 'C', 'D'])
right = pd.DataFrame(data={'value': np.random.randn(4)},
index=['B', 'D', 'E', 'F'])
left.index.name = right.index.name = 'idxkey'
left
value
idxkey
A -0.602923
B -0.402655
C 0.302329
D -0.524349
right
value
idxkey
B 0.543843
D 0.013135
E -0.326498
F 1.385076
通常,索引上的内部联接如下所示:
left.merge(right, left_index=True, right_index=True)
value_x value_y
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
其他联接遵循类似的语法。
值得注意的替代方案
DataFrame.join默认为索引上的联接。默认情况下,DataFrame.join执行LEFT OUTER join,因此how='inner'在这里是必要的。left.join(right,how='inner',lsuffix='_x',rsuffix='_y')值_x值_yidx键B-0.402655 0.543843D-0.524349 0.013135注意,我需要指定lsuffix和rsuffix参数,否则join将出错:left.join(右)ValueError:列重叠,但未指定后缀:Index(['value'],dtype='object')因为列名相同。如果它们的名称不同,这不会是一个问题。left.rename(columns={‘value‘:‘left value‘}).join(right,how=‘inner‘)左值idx键B-0.402655 0.543843D-0.524349 0.013135pd.concat在索引上连接,可以同时连接两个或多个DataFrame。默认情况下,它执行完全外部联接,因此此处需要how='inner'。。pd.contat([left,right],axis=1,sort=False,join='inner')价值,价值idx键B-0.402655 0.543843D-0.524349 0.013135有关concat的更多信息,请参阅本文。
索引到列连接
要使用左索引、右列索引执行内部联接,您将使用DataFrame.merge组合left_index=True和right_on=。。。。
right2 = right.reset_index().rename({'idxkey' : 'colkey'}, axis=1)
right2
colkey value
0 B 0.543843
1 D 0.013135
2 E -0.326498
3 F 1.385076
left.merge(right2, left_index=True, right_on='colkey')
value_x colkey value_y
0 -0.402655 B 0.543843
1 -0.524349 D 0.013135
其他连接遵循类似的结构。请注意,只有合并才能执行索引到列的连接。如果左侧的索引级别数等于右侧的列数,则可以连接多个列。
join和concat不能混合合并。您需要使用DataFrame.set_index将索引设置为预步骤。
有效使用命名索引[熊猫>=0.23]
如果索引已命名,则从panda>=0.23开始,DataFrame.merge允许您将索引名称指定为on(或根据需要指定left_on和right_on)。
left.merge(right, on='idxkey')
value_x value_y
idxkey
B -0.402655 0.543843
D -0.524349 0.013135
对于前面的合并索引为left、列为right的示例,可以使用索引名为left的left_on:
left.merge(right2, left_on='idxkey', right_on='colkey')
value_x colkey value_y
0 -0.402655 B 0.543843
1 -0.524349 D 0.013135
继续阅读
跳转到Pandas Merging 101中的其他主题继续学习:
合并基础知识-连接的基本类型基于索引的联接*推广到多个数据帧交叉联接
*你在这里