Установите MultiIndex при агрегировании с использованием панд GroupBy - PullRequest
2 голосов
/ 11 июня 2019

Некоторые упражнения просят «добавить вторичное имя» к столбцу df при применении функции агрегирования.

При заданном DF:

stype = ['s1','s1','s1','s1',
    's2','s2','s2','s2']
dtype = ['d1','d1','d2','d2',
        'd1','d1','d2','d2']
qty = [2, 1.4, 7, 3, 
        4, 1, 2.0, 3]
df = pd.DataFrame({'s_type':stype,
                    'd_type':dtype,
                    'qty':qty})

При группировании по первым 2 столбцами применяя функцию agg, как это

new_df=df.groupby(['s_type','d_type'],sort =  False).agg({'qty':'median'})

И напечатать (new_df)

Я получаю этот вывод, обратите внимание, что qty перемещается вверх на строку (я предполагаю, что это нормальное поведение) потому что это единственный столбец, в котором была применена функция agg

               qty
s_type d_type     
s1     d1      1.7
       d2      5.0
s2     d1      2.5
       d2      2.5

Вопрос (ы):

Можно ли установить имя дополнительного столбца в qty label / name?,чтобы получить вывод, подобный этому:

               qty
s_type d_type  Median   
s1     d1      1.7
       d2      5.0
s2     d1      2.5
       d2      2.5

Кроме того, почему qty поднимается на 1 строку вверх?(Я использую Spyder, и я видел это также в консоли Anaconda / python, не уверен, что это как функция или нормальное поведение панд).

Одно Последнее обновление: в случае, если вам нужно использовать sort_values, вам придется использовать кортеж для столбца, в который вы добавляете вторичный индекс / имя, почти таким же образом при применении агрегатной функции ( см. ответ )

new_df=new_df.sort_values([('qty','MEDIAN')])

Таким образом, вы получаете DF, отсортированный по столбцу, к которому была применена функция agg, и к которому мы добавили индекс

                 qty
              MEDIAN
s_type d_type       
s1     d1        1.7
s2     d1        2.5
       d2        2.5
s1     d2        5.0

python v3.6

панды v0.23

Спасибо.

1 Ответ

2 голосов
/ 11 июня 2019

Супер просто. Передайте "медиана" как список внутри agg:

result = df.groupby(['s_type','d_type'], sort=False).agg({'qty': ['median']})
result
                 qty
              median
s_type d_type       
s1     d1        1.7
       d2        5.0
s2     d1        2.5
       d2        2.5

Что касается «почему qty перемещается вверх на 1 строку», это означает, что первые два столбца на самом деле являются индексом в выходных данных. Запрос result.index сделает это очевидным:

result.index

MultiIndex(levels=[['s1', 's2'], ['d1', 'd2']],
           codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['s_type', 'd_type'])

Вместо этого вы можете указать as_index=False при вызове groupby,

df.groupby(['s_type','d_type'], sort=False, as_index=False).agg({'qty': ['median']})

  s_type d_type    qty
                median
0     s1     d1    1.7
1     s1     d2    5.0
2     s2     d1    2.5
3     s2     d2    2.5

Таким образом, группировщики остаются столбцами в выводе.


Вы можете изменить имя в выводе, передав список кортежей в agg:

df.groupby(['s_type','d_type'], sort=False).agg(
    {'qty': [('MEDIAN', 'median')]}
)

                 qty
              MEDIAN
s_type d_type       
s1     d1        1.7
       d2        5.0
s2     d1        2.5
       d2        2.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...