Python панды: группировать по одному уровню MultiIndex, но вместо этого оставаться другими уровнями - PullRequest
0 голосов
/ 31 мая 2018

Предположим, у меня есть DataFrame:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.arange(0, 24).reshape((3, 8)))
df.columns = pd.MultiIndex.from_arrays([
    ['a1', 'a1', 'a2', 'a2', 'b1', 'b1', 'b2', 'b2'],
    ['4th', '5th', '4th', '5th', '4th', '5th', '4th', '5th']
])
print(df)

вывод:

       a1      a2      b1      b2    
  4th 5th 4th 5th 4th 5th 4th 5th
0   0   1   2   3   4   5   6   7
1   8   9  10  11  12  13  14  15
2  16  17  18  19  20  21  22  23

Я хочу группировать по диктовке:

label_dict = {'a1': 'A', 'a2': 'A', 'b1': 'B', 'b2': 'B'}
res = df.groupby(label_dict, axis=1, level=0).sum()
print(res)

вывод:

    A   B
0   6  22
1  38  54
2  70  86

но я хочу вот что:

    A   A   B   B
  4th 5th 4th 5th
0   2   4  10  12
1  18  21  26  28
2  34  36  42  44

Есть какая-нибудь идея?Спасибо!

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Похоже на существующее решение, просто чтобы поставить его там:

res = df.rename_axis(label_dict, axis=1).groupby(level=[0,1], axis=1).sum()
res
#    A       B    
#  4th 5th 4th 5th
#0   2   4  10  12
#1  18  20  26  28
#2  34  36  42  44
0 голосов
/ 31 мая 2018

Другой способ, использующий изменение формы данных.

Уровень стека 1 многоиндексного столбца, затем используйте словарь для группировки столбцов и снимите стек, чтобы добавить многоиндексный столбец обратно в сгруппированные столбцы.

df.stack(1).groupby(label_dict, axis=1).sum().unstack()

Выход:

    A       B    
  4th 5th 4th 5th
0   2   4  10  12
1  18  20  26  28
2  34  36  42  44
0 голосов
/ 31 мая 2018

Используйте rename с sum обоими уровнями в MultiIndex в столбцах:

label_dict = {'a1': 'A', 'a2': 'A', 'b1': 'B', 'b2': 'B'}

res = df.rename(columns=label_dict, level=0).sum(level=[0,1], axis=1)
#alternative with groupby
#res = df.rename(columns=label_dict, level=0).groupby(level=[0,1], axis=1).sum()
print(res)
    A       B    
  4th 5th 4th 5th
0   2   4  10  12
1  18  20  26  28
2  34  36  42  44
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...