首页 > 解决方案 > 使用 Pandas MultiIndex 选择多行分层 DataFrame

问题描述

我有一个带有 3 个级别的 MultiIndex 的 Pandas DataFrame。假设我有以下数据

df = pd.DataFrame({'ColB': {('A1', 'B1', 1): 'cb1',
  ('A1', 'B1', 2): 'cb2',
  ('A1', 'B2', 1): 'cb3',
  ('A1', 'B2', 2): 'cb4',
  ('A2', 'B1', 1): 'cb5',
  ('A2', 'B1', 2): 'cb6',
  ('A2', 'B2', 1): 'cb7',
  ('A2', 'B2', 2): 'cb8'},
 'colA': {('A1', 'B1', 1): 'ca1',
  ('A1', 'B1', 2): 'ca2',
  ('A1', 'B2', 1): 'ca3',
  ('A1', 'B2', 2): 'ca4',
  ('A2', 'B1', 1): 'ca5',
  ('A2', 'B1', 2): 'ca6',
  ('A2', 'B2', 1): 'ca7',
  ('A2', 'B2', 2): 'ca8'}})

        ColB colA
A1 B1 1  cb1  ca1
      2  cb2  ca2
   B2 1  cb3  ca3
      2  cb4  ca4
A2 B1 1  cb5  ca5
      2  cb6  ca6
   B2 1  cb7  ca7
      2  cb8  ca8

现在,我有一个 MultiIndex 对象,其中包含前两个级别的索引,例如

MultiIndex([('A1', 'B2'),
            ('A2', 'B1')],
           )

我想使用该 MultiIndex 选择与该 MultiIndex 对应的所有行,包括第 3 级的所有索引,例如,

        ColB colA
A1 B2 1  cb3  ca3
      2  cb4  ca4
A2 B1 1  cb5  ca5
      2  cb6  ca6

我怎样才能做到这一点?我一直在寻找答案几个小时,但我仍然不知道。谢谢你。

标签: pythonpython-3.xpandas

解决方案


Index.isin与 remove 3rd level byMultiIndex.droplevel和 filter by一起使用boolean indexing

df = df[df.index.droplevel(2).isin(mux)]
print (df)
        ColB colA
A1 B2 1  cb3  ca3
      2  cb4  ca4
A2 B1 1  cb5  ca5
      2  cb6  ca6

它适用于任何index

mux = pd.MultiIndex.from_tuples([('A1', 'B1'),('A2', 'B2')])

df = df[df.index.droplevel(2).isin(mux)]
print (df)
        ColB colA
A1 B1 1  cb1  ca1
      2  cb2  ca2
A2 B2 1  cb7  ca7
      2  cb8  ca8

推荐阅读