首页 > 解决方案 > 列上的 pandas MultiIndex 从级别 0(外部)和级别 1(内部)中选择列

问题描述

使用以下虚拟数据框:

import pandas as pd

df = pd.DataFrame({'dt':['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-03', '2020-01-01', '2020-01-02', '2020-01-03', '2020-01-03'], 'group':['a', 'a', 'b', 'b', 'a', 'a', 'b', 'b'], 'bar':[1,2,3, 4, 1,2,3, 4], 'baz':[3,4,5, 6, 3,4,5, 6]})
df = df.groupby(['dt', 'group']).describe()

-ind

即我希望能够选择df[['dt', 'group', ('bar', '25%'), , ('bar', '25%'), , ('bar', '25%')]].

如何执行此多级选择?

我的最终目标是能够随着时间的推移绘制每个类别的百分位数,其中每个类别描述一种颜色:

import seaborn as sns; sns.set()
sns.lineplot(data=df.reset_index()['baz'][['25%', '50%', '75%']], hue='group')

但是,在剩余的数据帧中,没有留下关于组的信息。

标签: pythonpandasseabornmulti-indexpercentile

解决方案


不确定这是否是您所追求的:

 #assigned outcome to a different variable
 res = df.groupby(['dt', 'group']).describe()

#create a slicer, makes it easier to slice the multiIndex
idx = pd.IndexSlice

res.loc[idx[:],idx['bar',['25%','50%','75%']]]

你可以用它来达到同样的结果

res.loc(axis=1)['bar',['25%','50%','75%']]


                        bar
                25% 50% 75%
   dt   group           
2020-01-01  a   1.0 1.0 1.0
2020-01-02  a   2.0 2.0 2.0
2020-01-03  b   3.0 3.5 4.0

或横截面切片:

res.xs('bar',level=0,axis=1).filter(['25%','50%','75%'])

                25% 50% 75%
   dt   group           
2020-01-01  a   1.0 1.0 1.0
2020-01-02  a   2.0 2.0 2.0
2020-01-03  b   3.0 3.5 4.0

推荐阅读