通过 MultiIndex 选择 Pandas

Ran*_*nny 3 python multi-index dataframe pandas

关于通过 MultiIndex 选择行的问题。

df:

              colA   ColB

   A1   B1   1  ca1  cb1
             2  ca2  cb2
        B2   1  ca3  cb3
             2  ca4  cb4 
   A2   B1   1  ca5  cb5
             2  ca6  cb6
        B2   1  ca7  cb7
             2  ca8  cb8
Run Code Online (Sandbox Code Playgroud)

我想从 A2/B1 中选择 colA,其中 MultiIndex levels(2) > 1。我分多个步骤进行:

df1=df.loc[A2,[B7],:,]  
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我必须在括号中显示级别(1)

df1.index = x1.index.droplevel(0)

df1.index = x1.index.droplevel(0)

df1.loc[1:,'colA']
Run Code Online (Sandbox Code Playgroud)

我知道这太多了,但我不知道如何更简单地做到这一点。我能想到的方法都不想工作。

cs9*_*s95 5

既然你有不愿透露姓名的索引列的工作,一个方法是使用queryilevel_*-

df.query("ilevel_0 == 'A2' and ilevel_1 == 'B1' and ilevel_2 > 1")

        colA ColB
A2 B1 2  ca6  cb6
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用index.get_level_values-

f = df.index.get_level_values
df.loc[(f(0) == 'A2') & (f(1) == 'B1') & (f(2) > 1)]

        colA ColB
A2 B1 2  ca6  cb6
Run Code Online (Sandbox Code Playgroud)


Tai*_*Tai 5

您也可以通过两次操作来完成此操作。首先使用和loc中选择部分,然后通过设置 来对剩余索引执行另一个查询。A2B1query('index > 1')

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'}})

# Answer here
df.loc["A2", "B1"].query("index > 1")
Output:
    ColB    colA
 2  cb6     ca6
Run Code Online (Sandbox Code Playgroud)