2013-05-20 3 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

네의 인덱스를 포함하도록 newFactor의 dataframe를 다시 색인에 의해 서브 인덱스에 가입 함 -indexed DataFrame에 .join을 사용하여 다중 인덱싱 된 DataFrame의 수준을 지정합니다.

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

워드 프로세서는 또한 .join이 하나의 수준에와 GitHub의에서 두 multiindexed DataFrames을 병합 할 수 없습니다 언급 :

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

The 0.14 pandas docs은보다이 같은 동등하지만 메모리 효율적이고 빠른 설명 추적기 토론 이전 문제에 대한 구현이 우선 순위 않을 수도 있습니다 :

그래서 단일 조인에 병합 # 6363 참조 ; 에있는 여러 문서와 함께 멀티 멀티 조인을 수행하는 방법을 설명합니다. 실제로 실제로는 구현하기가 상당히 복잡합니다. IMHO는 노력을 기울일 가치가 없으므로 실제로는 사용하지 않습니다. 메모리 사용량/속도가 그다지 변하지 않습니다.

그러나 최근에 개발 된 https://github.com/pydata/pandas/issues/6360과 관련하여 GitHub 대화가 있습니다. 앞서 언급 한 바와 같이 색인을 재설정하고 문서에서도 설명하는 방법으로이를 달성 할 수도 있습니다.

+1

첫 번째 예를 들어, 참여에 사용할 MultiIndex의 수준을 어떻게 선택합니까? –

+1

nvm에서 [docs] (http://pandas.pydata.org/pandas-docs/stable/merging.html#joining-a-single-index-to-a-multindexex)는 색인 레벨은 단일 레벨 색인과 동일한 이름을가집니다. –

+0

그리고 조인은 팬더에서 매우 빠릅니다. –

2

데이터 프레임 병합을 다시 인덱싱하여 왼쪽 멀티 조인이 가능하도록 전체 멀티 인덱스를 가질 수 있습니다. 팬더 0.14.0은, 단독으로 병합하는 것이 가능하기 때문에

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

은, 왼쪽 데이터 프레임

df.join(newFactor.reindex(df.index,level=0)) 
1

나는 하나의 컬럼에 매핑을 사용합니다 :

당신이에 가입 할 MultiIndex의 수준에 추가 열을 생성하고/통합하면 어떻게
df1['newcol'] = df1.index.get_level_values(-1).map(lambda x: df2.newcol[x]) 
관련 문제