如何将数据帧转换为 pandas IndexSlice 以索引另一个 MultiIndex 数据帧

How to convert a dataframe into a pandas IndexSlice to index another MultiIndex dataframe

我有以下 2 个数据帧 df1 和 df2:

import pandas as pd

m_idx = pd.MultiIndex.from_product([range(3), range(3, 6), range(6, 8)])
m_idx.names = ['a', 'b', 'c']
df1 = pd.DataFrame(None, index=m_idx, columns=['x1', 'x2', 'x3'])
df1.loc[:, 'x1'] = m_idx.get_level_values('a') + m_idx.get_level_values('b') + m_idx.get_level_values('c')
df1.loc[:, 'x2'] = df1.loc[:, 'x1'] * 2
df1.loc[:, 'x3'] = df1.loc[:, 'x1'] * 3

df2 = pd.DataFrame({'a': [0, 2], 'c': [6, 6]})

df1:

       x1  x2  x3
a b c            
0 3 6   9  18  27
    7  10  20  30
  4 6  10  20  30
    7  11  22  33
  5 6  11  22  33
    7  12  24  36
1 3 6  10  20  30
    7  11  22  33
  4 6  11  22  33
    7  12  24  36
  5 6  12  24  36
    7  13  26  39
2 3 6  11  22  33
    7  12  24  36
  4 6  12  24  36
    7  13  26  39
  5 6  13  26  39
    7  14  28  42

df2:

   a  c
0  0  6
1  2  6

我如何将 df2 转换成我可以用来查找 df1 索引的东西,其中 df2 的列名是级别,并且在每一行中你都有你想要从 df1 中获取的键组合索引.

或者换句话说,我怎样才能将 df2 转换成相当于

的东西
df1.loc[pd.IndexSlice[[0, 2], :, [6, 6]], :]

这会 return:

       x1  x2  x3
a b c            
0 3 6   9  18  27
  4 6  10  20  30
  5 6  11  22  33
2 3 6  11  22  33
  4 6  12  24  36
  5 6  13  26  39

这是我实际要解决的问题的一个非常简化的小规模版本。所以真的很想即时创建 pd.IndexSlice。

并且我在我的代码中做了类似的事情,但是对于我的目的来说它花费的时间太长了。

df_list = [df1.loc[(v[0], slice(None), v[1]), :] for r, v in df2.iterrows()]
df_sliced = pd.concat(df_list)

所以我希望使用 pd.IndexSlice 或其他替代方法会更快。

非常感谢!

df1 的索引转换为数据帧,然后在匹配级别上使用 isin + all 来复制索引切片的行为

d = df2.to_dict('list')
df1[df1.index.to_frame()[d].isin(d).all(1)]

       x1  x2  x3
a b c            
0 3 6   9  18  27
  4 6  10  20  30
  5 6  11  22  33
2 3 6  11  22  33
  4 6  12  24  36
  5 6  13  26  39