2013-05-20 84 views
22

有沒有什麼方法可以在不重置索引的情況下在MultiIndex的單一級別上進行合併?在單一級別的MultiIndex上合併

我有一個「靜態」時間不變值表,由一個ObjectID索引,我有一個「動態」時變字段表,由ObjectID + Date索引。我想一起參加這些表格。

現在,我能想到的最好的是:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True) 

但是,動態表是非常大的,我不希望有它的索引渣土爲了結合各地值。

+0

當你創建你想加入對多指標的水平的額外列,然後合併/加入了什麼對上的?可能不是完全有效的,但至少你保持索引。 –

+0

是的,這將工作。這會花費一些記憶,並且不會加快速度。不過,在這一點上,如果不能幫助加速合併,我認爲我完全可以放棄這個指數。 –

+2

對應的github問題https://github.com/pydata/pandas/issues/3662 –

回答

9

是指數,因爲大熊貓0.14.0,現在可以將單獨合併使用.join索引DataFrame與多索引DataFrame的級別。

df1.join(df2, how='inner') # how='outer' keeps all records from both data frames 

The 0.14 pandas docs其描述爲等效的,但是更多的存儲器效率和速度比:

merge(df1.reset_index(), 
     df2.reset_index(), 
     on=['index1'], 
     how='inner' 
    ).set_index(['index1','index2']) 

該文檔還提到,.join不能被用於在一個單一的電平,並從GitHub的合併兩個multiindexed DataFrames跟蹤器討論的前一個問題,似乎這可能不是優先執行:

所以我合併在單加入,請參閱#6363 ;以及一些關於如何進行多重多點連接的文檔 。這實際上是相當複雜的 實施。和恕我直言,不值得的努力,因爲它真的不會改變內存使用/速度很多 。

但是,有關於此的GitHub對話,其中最近有一些發展https://github.com/pydata/pandas/issues/6360。也可以通過重新設置前面提到的和文檔中描述的指標來實現這一點。

+1

對於第一個示例,您如何選擇用於連接的MultiIndex的級別? –

+1

nvm,[docs](http://pandas.pydata.org/pandas-docs/stable/merging.html#joining-a-single-index-to-a-multi-index)表示它基於該索引級別與單級索引具有相同的名稱。 –

+0

熊貓的連接速度非常快 –

2

我通過重新索引數據幀合併來獲得完整的多重索引,以便左連接是可能的。

# 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)) 
1

我會用映射單個列:

df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x])