2015-08-13 9 views
0

Мне интересно, как наилучшим образом срезать мультииндекс, используя другой индекс, где другой индекс является подмножеством основного мультииндекса.MultiIndex Slice | срез с другим индексом по подмножеству уровней

np.random.seed(1) 
dict_data_russian = {'alpha':[1,2,3,4,5,6,7,8,9],'beta':['a','b','c','d','e','f','g','h','i'],'gamma':['r','s','t','u','v','w','x','y','z'],'value_r': np.random.rand(9)} 
dict_data_doll = {'beta':['d','e','f'],'gamma':['u','v','w'],'dont_care': list('PQR')} 
df_russian = pd.DataFrame(data=dict_data_russian) 
df_russian.set_index(['alpha','beta','gamma'],inplace=True) 
df_doll = pd.DataFrame(data=dict_data_doll) 
df_doll.set_index(['beta','gamma'],inplace=True) 

print df_russian 
print df_doll.head() 

Что дает:

    value_r 
alpha beta gamma   
1  a r  0.4170 
2  b s  0.7203 
3  c t  0.0001 
4  d u  0.3023 
5  e v  0.1468 
6  f w  0.0923 
7  g x  0.1863 
8  h y  0.3456 
9  i z  0.3968 


      dont_care 
beta gamma   
d u    P 
e v    Q 
f w    R 

Как лучше использовать индекс в df_doll нарезать df_russian на уровни бета & гамма, для того, чтобы следующий вывод?

    value_r 
alpha beta gamma   
4  d u  0.3023 
5  e v  0.1468 
6  f w  0.0923 

ответ

2

можно сделать

In [1131]: df_russian[df_russian.reset_index(0).index.isin(df_doll.index)] 
Out[1131]: 

alpha beta gamma value_r 
    4 d  u 0.302333 
    5 e  v 0.146756 
    6 f  w 0.092339 

При этом используется булево ключ, полученное путем сброса внешнего уровня основного индекса и проверок, если остальные уровни находятся в индексе df_doll для каждой строки.

0

Вы можете сдирать индекс, присоединиться кадры, а затем добавить обратно индекс

result = df_doll.reset_index().merge(df_russian.reset_index(), on=['beta', 'gamma'], how='inner') 
result.set_index(['alpha', 'beta', 'gamma'], inplace=True) 
result.drop('dont_care', 1) 
Смежные вопросы