MultiIndex Slice |切片与级别子集中的另一个索引

时间:2015-08-13 14:46:36

标签: python pandas

我想知道使用另一个索引切割多索引的最佳方法,其中另一个索引是主要多索引的子集。

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,在beta&级别上伽玛,为了以下输出?

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

2 个答案:

答案 0 :(得分: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索引中而得到的布尔键。

答案 1 :(得分: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)