Добавить промежуточные столбцы в пандах с мультииндекс

У меня есть фреймворк с 3-уровневым глубоким мультииндексиром на столбцах. Я хотел бы вычислить промежуточные sum(axis=1) по строкам ( sum(axis=1) ), где я суммируюсь на одном из уровней, сохраняя остальные. Я думаю, что знаю, как это сделать, используя аргумент ключевого слова level pd.DataFrame.sum . Однако у меня возникают проблемы с тем, как включить результат этой суммы обратно в исходную таблицу.

Настроить:

 import numpy as np import pandas as pd from itertools import product np.random.seed(0) colors = ['red', 'green'] shapes = ['square', 'circle'] obsnum = range(5) rows = list(product(colors, shapes, obsnum)) idx = pd.MultiIndex.from_tuples(rows) idx.names = ['color', 'shape', 'obsnum'] df = pd.DataFrame({'attr1': np.random.randn(len(rows)), 'attr2': 100 * np.random.randn(len(rows))}, index=idx) df.columns.names = ['attribute'] df = df.unstack(['color', 'shape']) 

Придает красивый кадр:

Оригинальная рамка

Скажем, я хотел уменьшить уровень shape . Я мог бы запустить:

 tots = df.sum(axis=1, level=['attribute', 'color']) 

чтобы получить мои итоги так:

общие данные

Как только у меня есть это, я хотел бы применить его к исходному фрейму. Я думаю, что могу сделать это несколько громоздким способом:

 tots = df.sum(axis=1, level=['attribute', 'color']) newcols = pd.MultiIndex.from_tuples(list((i[0], i[1], 'sum(shape)') for i in tots.columns)) tots.columns = newcols bigframe = pd.concat([df, tots], axis=1).sort_index(axis=1) 

совокупный

Есть ли более естественный способ сделать это?

2 Solutions collect form web for “Добавить промежуточные столбцы в пандах с мультииндекс”

Вот путь без петель:

 s = df.sum(axis=1, level=[0,1]).T s["shape"] = "sum(shape)" s.set_index("shape", append=True, inplace=True) df.combine_first(sT) 

Хитрость заключается в использовании транспонированной суммы. Таким образом, мы можем вставить другой столбец (т.е. строку) с именем дополнительного уровня, который мы называем точно так же, как тот, который мы суммировали. Этот столбец можно преобразовать в уровень в индексе с помощью set_index . Затем мы объединяем df с транспонированной суммой. Если суммарный уровень не является последним, вам может потребоваться некоторое переупорядочение уровня.

Вот мой грубой способ сделать это.

После выполнения вашего хорошо написанного (спасибо) образца кода я сделал следующее:

 attributes = pd.unique(df.columns.get_level_values('attribute')) colors = pd.unique(df.columns.get_level_values('color')) for attr in attributes: for clr in colors: df[(attr, clr, 'sum')] = df.xs([attr, clr], level=['attribute', 'color'], axis=1).sum(axis=1) df 

Что дает мне:

большой стол

  • Отделите конкретный столбец и добавьте их в виде столбцов в CSV (Python3, CSV)
  • NumPy суммирует один массив на основе значений в другом массиве для каждого соответствующего элемента в 3-м массиве
  • Используя pandas в Python, как я могу сделать гистограмму одного блока данных, используя ячейки из другого фрейма данных?
  • Ошибка типа Pandas, пытающаяся построить
  • Pandas sort_index дает странный результат после применения функции для группировки DataFrame
  • Получение (индекс, столбец) пар для Истинных элементов логического DataFrame в Pandas
  • Пользовательская функция Python с использованием roll_apply для pandas
  • Состояние распараллеливания pandas.apply ()
  •  
    Interesting Posts for Van-Lav

    Pip Requirements.txt –global-option, вызывающий ошибки установки с другими пакетами. "Вариант не распознан"

    Ошибка при попытке добавить цветную панель

    Загрузите изображение в хранилище Appengine Datastore с помощью BlobStore и конечных точек

    Как анализировать использование памяти из дампа ядра?

    Python – IOError: Разрешение отклонено:

    Почему я не могу получить доступ к переменной из другого класса Python

    «Требуется версия Python версии 2.7, которая не была найдена в реестре» при попытке установить netCDF4 на Windows 8

    Нет модуля с именем PIL

    Python pycrypto module: почему simplejson не может сбрасывать зашифрованную строку?

    PyCrypto установить, скопировав папку «lib» на Windows7 64bit

    Mongo db не соответствует запросу, не работающему

    совпадение конечной косой черты с регулярным выражением Python

    извлечь последние два поля из split

    Создание приложения командной строки оболочки с помощью Python и Click

    Не распознавать переменную цикла в Python

    Python - лучший язык программирования в мире.