Python 单级多索引上的合并
有没有办法在不重置索引的情况下在多索引的单个级别上进行合并 我有一个由ObjectID索引的时不变值静态表,还有一个由时变字段动态表,由ObjectID+Date索引。我想把这些桌子连在一起 现在,我能想到的最好的办法是:Python 单级多索引上的合并,python,pandas,Python,Pandas,有没有办法在不重置索引的情况下在多索引的单个级别上进行合并 我有一个由ObjectID索引的时不变值静态表,还有一个由时变字段动态表,由ObjectID+Date索引。我想把这些桌子连在一起 现在,我能想到的最好的办法是: dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True) 但是,动态表非常大,我不想为了组合值而不得不修改索引。我通过重新索引数据帧合并来解决这个问题,以获得完整的多索引,从而实现
dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True)
但是,动态表非常大,我不想为了组合值而不得不修改索引。我通过重新索引数据帧合并来解决这个问题,以获得完整的多索引,从而实现左连接
# Create the left data frame
import pandas as pd
idx = pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[0,0,1,1],[0,1,0,1]], names=['lvl1','lvl2'])
df = pd.DataFrame([1,2,3,4],index=idx,columns=['data'])
#Create the factor to join to the data 'left data frame'
newFactor = pd.DataFrame(['fact:'+str(x) for x in df.index.levels[0]], index=df.index.levels[0], columns=['newFactor'])
通过对newFactor数据帧重新编制索引以包含左侧数据帧的索引,对子索引进行连接
df.join(newFactor.reindex(df.index,level=0))
是的,自pandas 0.14.0以来,现在可以使用.join将单索引数据帧与多索引数据帧的级别合并 将其描述为等效但内存效率更高且速度比:
merge(df1.reset_index(),
df2.reset_index(),
on=['index1'],
how='inner'
).set_index(['index1','index2'])
文档中还提到,.join不能用于在一个级别上合并两个多索引数据帧,从上一期的GitHub tracker讨论来看,这似乎不是优先实现的:
因此,我合并到单一连接中,参见6363;还有一些文件
如何进行多重联接。事实上,这相当复杂
使生效而且我不值得付出努力,因为它真的不会改变
内存使用率/速度根本没有这么高
然而,关于这一点,有一个GitHub对话,其中有一些最新的发展。也可以通过重置前面提到的以及文档中描述的索引来实现这一点
熊猫更新>=0.24.0
现在可以相互合并多索引数据帧。根据:
输出:
我将对单个列使用映射:
df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x])
这对我有用
gData.columns = gData.columns.droplevel(0)
grpData = gData.reset_index()
grpData
pd.merge(grpData,cusData,how='inner')
这里,gData是具有两个级别的多索引数据帧,cusData是单索引数据帧 如果您创建了一个附加列,该列的级别与您要加入的多索引相同,然后在该列上进行合并/加入,该怎么办?可能不是完全有效,但至少您可以维护索引。是的,这会起作用。这会消耗一些内存,也无助于提高速度。不过,在这一点上,我想我还是完全放弃索引吧,如果这无助于加快合并的速度。相应的github问题对于您的第一个示例,如何选择用于连接的多索引级别?nvm,假设它基于与单级索引同名的索引级别进行连接,并且连接速度非常快pandas@HenryHenrinson如果要使用数据帧中键的并集,即保留两个帧中的所有记录,并根据需要引入NaN以填充结果表,请使用how=outer。因为问题中使用了merge作为示例,所以我使用了how=inner,这是merge的默认行为。通过中的how参数和在Python控制台中键入?pd.DataFrame.join,您可以阅读有关不同联接的更多信息。我在上面加了一个简短的注释作为评论。
A B C D
key X Y
K0 X0 Y0 A0 B0 C0 D0
X1 Y0 A1 B1 C0 D0
K1 X2 Y1 A2 B2 C1 D1
[3 rows x 4 columns]
df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x])
gData.columns = gData.columns.droplevel(0)
grpData = gData.reset_index()
grpData
pd.merge(grpData,cusData,how='inner')