【问题标题】:Most efficient way to group by 3rd level and access columns按第三级分组和访问列的最有效方法
【发布时间】:2018-06-14 21:52:18
【问题描述】:

我想采用具有多索引和多列的 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']

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    取每个值的横截面:

    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])
    

    【讨论】:

    • 横截面方法是我正在做的,但我希望像你提到的小组那样用不同的方法做会明显更快。打算试试看。
    • 我测试了 groupby 方法,它似乎比 xs 快 2 倍。谢谢!
    【解决方案2】:

    一种使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多