【问题标题】:How to convert a dataframe into a pandas IndexSlice to index another MultiIndex dataframe如何将数据帧转换为 pandas IndexSlice 以索引另一个 MultiIndex 数据帧
【发布时间】:2021-12-01 04:35:20
【问题描述】:

我有以下 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]], :]

会返回:

       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。

I see a separate question that suggested this 并且我在我的代码中做了类似的事情,但是对于我的目的来说这需要很长时间。

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

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

非常感谢!

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    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
    

    【讨论】:

    • 这很好用,简化了我的代码并且速度更快!非常感谢您的回答!
    • @Arthur 编码快乐!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2019-06-29
    • 2021-10-06
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    相关资源
    最近更新 更多