【问题标题】:Pandas Multiindex selecting row skipping one levelPandas Multiindex 选择行跳过一级
【发布时间】:2018-01-02 23:28:12
【问题描述】:

这似乎很简单,但我的解决方案最终变得相当复杂。

我有 3 级多索引的 df,我想根据 0 级和 2 级选择行,同时忽略 1 级的值(但不删除此级别)。

df L0 L1 L2 colA colB A1 B1 C1 1 2 C2 3 4 B2 C1 5 6 C2 7 8 A2 B3 C1 9 10 C2 11 12 B4 C1 13 14 C2 15 16

在这里,我想根据 A 和 C 提取行,而 B 保持不变。

df.loc[[A,:,C],colB] 不起作用。

我已经通过操纵多索引级别来解决问题,但它非常复杂(对我而言)并且应该有更简单的解决方案。

【问题讨论】:

标签: pandas


【解决方案1】:

使用slicers:

idx = pd.IndexSlice
df1 = df.loc[idx['A1',:,'C1'],'colB']

或者:

df1 = df.loc[('A1',slice(None),'C1'),'colB']

print (df1)
L0  L1  L2
A1  B1  C1    2
    B2  C1    6
Name: colB, dtype: int64

【讨论】:

    【解决方案2】:

    另一种方法是使用loc(axis=0),根据pandas documenation on using slicers

    df.loc(axis=0)['A1',:,'C1']
    

    输出:

              colA  colB
    L0 L1 L2            
    A1 B1 C1     1     2
       B2 C1     5     6
    

    【讨论】:

      【解决方案3】:

      pandas 0.22 中的新功能

      df.query('ilevel_0=="A1" & ilevel_2=="C1"')   
      

      在你的情况下应该是

      df.query('L0=="A1" & L2=="C1"')   
      Out[187]: 
                colA  colB
      L0 L1 L2            
      A1 B1 C1     1     2
         B2 C1     5     6
      

      【讨论】:

        【解决方案4】:

        xs 也能很好地做到这一点:

        df
                  colA  colB
        L0 L1 L2            
        A1 B1 C1     1     2
              C2     3     4
           B2 C1     5     6
              C2     7     8
        A2 B3 C1     9    10
              C2    11    12
           B4 C1    13    14
              C2    15    16
        
        df.xs(['A1', 'C1'], level=[0,2], drop_level=False)
                  colA  colB
        L0 L1 L2            
        A1 B1 C1     1     2
           B2 C1     5     6
        

        【讨论】:

        • 谢谢大家。很大的帮助。我现在要做的就是速度测试:)
        • 粗略结果:idx - 6.35 ms ± 216 µs // 'loc /slice(None - 5.47 ms ± 65.5 µs // loc(axis=0) - 4.87 ms ± 70.1 µs // 查询 - 30.5 ms ± 597 µs // xs 3.02 ms ± 63.5 µs 但测量结果略有不同,因为我在这里只要求一列的数据,而在其他测试中来自两列。我想我会尝试在 .loc 中使用 xs。再次,非常感谢您的帮助。
        猜你喜欢
        • 2022-06-15
        • 2018-05-31
        • 2019-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多