Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单级多索引上的合并_Python_Pandas - Fatal编程技术网

Python 单级多索引上的合并

Python 单级多索引上的合并,python,pandas,Python,Pandas,有没有办法在不重置索引的情况下在多索引的单个级别上进行合并 我有一个由ObjectID索引的时不变值静态表,还有一个由时变字段动态表,由ObjectID+Date索引。我想把这些桌子连在一起 现在,我能想到的最好的办法是: dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True) 但是,动态表非常大,我不想为了组合值而不得不修改索引。我通过重新索引数据帧合并来解决这个问题,以获得完整的多索引,从而实现

有没有办法在不重置索引的情况下在多索引的单个级别上进行合并

我有一个由ObjectID索引的时不变值静态表,还有一个由时变字段动态表,由ObjectID+Date索引。我想把这些桌子连在一起

现在,我能想到的最好的办法是:

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')