最有效的分组方式是第3级和访问列

时间:2018-06-14 21:52:19

标签: python python-3.x pandas dataframe

我想拍摄一个包含多索引和多列的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 个答案:

答案 0 :(得分:2)

取每个值的横截面:

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

答案 1 :(得分:0)

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