代码之家  ›  专栏  ›  技术社区  ›  cooke

按第三级分组和访问列的最有效方法

  •  4
  • cooke  · 技术社区  · 6 年前

    我想要一个pandas数据框,它有一个多索引和多列。我想找到最有效的方法,通过第三个多索引遍历列。我想拆箱,但我不知道如何通过索引访问它们。有没有更好的方法(更快的处理方式):

    df = pandas.DataFrame([{'Index_A':2018,'Index_B':0,'Index_C':101,'Col_D':0.3,'Col_E':.4},{'Index_A':2019,'Index_B':0,'Index_C':101,'Col_D':0.3,'Col_E':.4},{'Index_A':2019,'Index_B':0,'Index_C':102,'Col_D':0.3,'Col_E':.4}])
    
    df = df.set_index(['Index_A','Index_B','Index_C'])
    df = df.unstack()
    
    for Index_C in [101,102]:
        # get dataframe with index of ['Index_A','Index_B'] and columns ['Col_D,'Col_E']
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Oliver Sherouse    6 年前

    取每个值的横截面:

    for i in df.index.levels[2].unique():
        print(df.xs(i, level=2))
    

    或者,如果索引中没有第三个级别并不重要,可以执行以下操作:

    for i, j in df.groupby(level=2).groups.items():
        print(df.loc[j])
    
        2
  •  0
  •   jpp    6 年前

    单向使用 pd.DataFrame.query :

    for i in df.index.get_level_values(2).unique():
        print(df.query(f'Index_C == {i}'))
    
                             Col_D  Col_E
    Index_A Index_B Index_C              
    2018    0       101        0.3    0.4
    2019    0       101        0.3    0.4
    
                             Col_D  Col_E
    Index_A Index_B Index_C              
    2019    0       102        0.3    0.4
    

    如果你真的想放弃决赛 MultiIndex 标签,您可以这样做:

    for i in df.index.get_level_values(2).unique():
        res = df.query(f'Index_C == {i}')   
        res.index = res.index.droplevel(2)  
        print(res)
    
                     Col_D  Col_E
    Index_A Index_B              
    2018    0          0.3    0.4
    2019    0          0.3    0.4
    
                     Col_D  Col_E
    Index_A Index_B              
    2019    0          0.3    0.4