pandas MultiIndex по столбцам выбирает столбцы с уровня 0 (снаружи), а также с уровня 1 (внутри) - PullRequest
0 голосов
/ 05 мая 2020

Использование фиктивного фрейма данных:

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

Однако в оставшемся фрейме данных не осталось информации о группе.

Ответы [ 3 ]

1 голос
/ 05 мая 2020

не уверен, что это именно то, что вам нужно:

 #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
1 голос
/ 05 мая 2020

Еще один способ снять шкуру с кошки:

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
0 голосов
/ 05 мая 2020

Т.е. я хочу иметь возможность выбрать 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-> dataframe values, hue-> соответствующий каждой группе, а затем у вас есть каждый столбец процентилей, например ('bar', '25%'), ('bar', '50%')). Непонятно, как вы хотите отличить guish от ('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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...