列上的多索引从级别0(外部)和级别1(内部)中选择列

2024-04-27 02:48:28 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下虚拟数据帧:

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

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


Tags: 数据importdataframepandasdfasdtgroup
3条回答

不确定这是否是您想要的:

 #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

I.e. I want to be able to select df[['dt', 'group', ('bar', '25%'), , ('bar', '25%'), , ('bar', '25%')]].

您可以执行以下操作:

df.reset_index()[[('dt', ""), ('group', ""), ('bar', '25%'), ('bar', '50%')]]

输出:

           dt group  bar     
                     25%  50%
0  2020-01-01     a  1.0  1.0
1  2020-01-02     a  2.0  2.0
2  2020-01-03     b  3.0  3.5

至于这个图,在我看来,你想画一个4维的图。。。(x->;dt,y->;数据帧值,色调->;对应于每个组,然后您有每个百分位列,例如('bar', '25%')('bar', '50%'))。不清楚如何区分绘图中的('bar', '25%')('bar', '50%')。也许您预计会有6个单独的图(3个百分位数*2列[bar,baz]),在这种情况下,这可能会有所帮助:

sns.lineplot(data=df.reset_index(), x="dt", y=("bar", '25%'), hue='group')

enter image description here

只是另一种剥猫皮的方法:

print (df["bar"].filter(like="%"))

                  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

相关问题 更多 >