Pandas groupby с многоиндексными столбцамиPython

Программы на Python
Ответить
Anonymous
 Pandas groupby с многоиндексными столбцами

Сообщение Anonymous »

Моя цель, способ ее достижения и что происходит вместо этого
Я пытаюсь выполнить группировку в DataFrame, который имеет многоиндексные столбцы, используя серию (без мультииндекса). в качестве входных данных для группировки. В частности, учитывая приведенный ниже DataFrame
>>> df
X Y
A B C A B C
2020-01-01 9 1 2 1 6 5
2020-01-02 5 7 8 0 6 9
2020-01-03 6 3 4 8 6 1
2020-01-06 0 0 9 0 5 1
2020-01-07 8 7 4 8 3 1

и серии, представляющие группы
>>> groups
A D
B D
C E
dtype: object

Я пытаюсь запустить следующее
>>> df.groupby(groups, axis=1, level=1).sum()

и ожидайте получения
X Y
D E D E
2020-01-01 10 2 7 5
2020-01-02 12 8 6 9
2020-01-03 9 4 14 1
2020-01-06 0 9 5 1
2020-01-07 15 4 11 1

Вместо этого я получаю следующую ошибку:
Traceback (most recent call last):
File "", line 1, in
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/frame.py", line 6717, in groupby
return DataFrameGroupBy(
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/groupby.py", line 560, in __init__
grouper, exclusions, obj = get_grouper(
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/grouper.py", line 828, in get_grouper
Grouping(
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/groupby/grouper.py", line 485, in __init__
) = index._get_grouper_for_level(self.grouper, level)
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/indexes/multi.py", line 1487, in _get_grouper_for_level
grouper = level_values.map(mapper)
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/indexes/base.py", line 5098, in map
new_values = super()._map_values(mapper, na_action=na_action)
File "/home/zak/anaconda3/envs/lib/python3.8/site-packages/pandas/core/base.py", line 937, in _map_values
new_values = map_f(values, mapper)
File "pandas/_libs/lib.pyx", line 2467, in pandas._libs.lib.map_infer
TypeError: 'numpy.ndarray' object is not callable

Я использую Python 3.8.8 и Pandas версии 1.2.3.
Неоптимальное решение
Один из способов достижения вышеизложенного я нашел с помощью следующего кода, но мне особенно интересно, есть ли более чистый способ сделать это. Если нет, то почему? На мой взгляд, описанная выше попытка была бы ожидаемым поведением метода groupby, но, похоже, я неправильно понимаю ее логику.
>>> df, groups = df.align(groups, axis=1, level=1)
>>> df.groupby(groups, axis=1).apply(lambda x: x.sum(axis=1, level=0)).swaplevel(axis=1).sort_index(axis=1)
X Y
D E D E
2020-01-01 10 2 7 5
2020-01-02 12 8 6 9
2020-01-03 9 4 14 1
2020-01-06 0 9 5 1
2020-01-07 15 4 11 1


Подробнее здесь: https://stackoverflow.com/questions/671 ... ex-columns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»