2016-11-04 3 views
2

здесь мои два dataframesслияния мультииндекс dataframe с неравной длиной

index = pd.MultiIndex.from_product([['a','b'],[1,2]],names=['one','two']) 
df = pd.DataFrame({'col':[10,20,30,40]}, index = index) 
df 
      col 
one two  
a 1  10 
    2  20 
b 1  30 
    2  40 

index_1 = pd.MultiIndex.from_product([['a','b'],[1.,2],['abc','mno','xyz']], names = ['one','two','three']) 
temp = pd.DataFrame({'col1':[1,2,3,4,5,6,7,8,9,10,11,12]}, index = index_1) 
temp 
       col1 
one two three  
    a 1.0 abc  1 
      mno  2 
      xyz  3 
     2.0 abc  4 
      mno  5 
      xyz  6 
    b 1.0 abc  7 
      mno  8 
      xyz  9 
     2.0 abc  10 
      mno  11 
      xyz  12 

как я могу объединить их оба? Я попытался это

pd.merge(left = temp, right = df, left_on = temp.index.levels[0], right_on = df.index.levels[0]) 

, но это не работает

KeyError: "Index([u'a', u'b'], dtype='object', name=u'one') not in index" 

если преобразовать индекс в столбцы через reset_index(), чем слияния работ. Однако я хочу добиться этого, сохранив структуру индекса.

мой желаемый результат:

enter image description here

ответ

1

Метод 1
reset_index + merge

df.reset_index().merge(temp.reset_index()).set_index(index_1.names) 

метод 2
join с reset_index частичной

df.join(temp.reset_index('three')).set_index('three', append=True) 

enter image description here

+0

Большое спасибо, это работает. Я долго болтал с pd.merge и pd.reset_index, но не поразил меня тем, что я могу использовать их таким образом. Можете ли вы предложить, как я могу улучшить свои навыки работы с данными временных рядов в пандах? –

+1

@SirajS. лучший способ - попытаться ответить на эти вопросы в stackoverflow ... no joke! – piRSquared