Использование cumsum in pandas в группе ()

От новичка Pandas: у меня есть данные, которые выглядят в основном так:

data1=pd.DataFrame({'Dir':['E','E','W','W','E','W','W','E'], 'Bool':['Y','N','Y','N','Y','N','Y','N'], 'Data':[4,5,6,7,8,9,10,11]}, index=pd.DatetimeIndex(['12/30/2000','12/30/2000','12/30/2000','1/2/2001','1/3/2001','1/3/2001','12/30/2000','12/30/2000'])) data1 Out[1]: Bool Data Dir 2000-12-30 Y 4 E 2000-12-30 N 5 E 2000-12-30 Y 6 W 2001-01-02 N 7 W 2001-01-03 Y 8 E 2001-01-03 N 9 W 2000-12-30 Y 10 W 2000-12-30 N 11 E 

И я хочу сгруппировать его несколькими уровнями, а затем сделать cumsum ():

Например, running_sum=data1.groupby(['Bool','Dir']).cumsum() <- (Не работает)

с выходом, который будет выглядеть примерно так:

 Bool Dir Date running_sum NE 2000-12-30 16 W 2001-01-02 7 2001-01-03 16 YE 2000-12-30 4 2001-01-03 12 W 2000-12-30 16 

Мой «похожий» код явно не закрыт. Я предпринял ряд попыток и узнал много нового о том, как не делать этого.

Спасибо за любую помощь, которую вы можете дать.

2 Solutions collect form web for “Использование cumsum in pandas в группе ()”

Попробуй это:

 data2 = data1.reset_index() data3 = data2.set_index(["Bool", "Dir", "index"]) # index is the new column created by reset_index running_sum = data3.groupby(level=[0,1,2]).sum().groupby(level=[0,1]).cumsum() 

Причина, по которой вы не можете просто использовать cumsum для data3 , связана с тем, как структурированы ваши данные. Группировка Bool и Dir и применение функции агрегации ( sum , mean и т. Д.) Приведет к созданию DataFrame меньшего размера, чем вы начали, поскольку любая используемая вами функция будет агрегировать значения на основе ваших групповых ключей. Однако cumsum не является функцией aggreagation. Это вернет DataFrame, размер которого совпадает с тем, с которым он звонил. Поэтому, если ваш входной DataFrame не находится в формате, где вывод может быть того же размера после вызова cumsum , он cumsum ошибку. Вот почему я сначала назвал sum , который возвращает DataFrame в правильном формате ввода.

Извините, если я не объяснил это достаточно хорошо. Может, кто-то другой может мне помочь?

Как указывает другой ответ, вы пытаетесь свернуть идентичные даты в отдельные строки, тогда как функция cumsum вернет серию той же длины, что и исходный DataFrame. Иными словами, вы действительно хотите группировать [Bool, Dir, Date], вычислять сумму в каждой группе, затем возвращать cumsum в строках, сгруппированных по [Bool, Dir]. Другой ответ – это абсолютно правильное решение для вашего конкретного вопроса, здесь есть однострочный вариант:

 data1.groupby(['Bool', 'Dir', 'Date']).sum().groupby(level=[0, 1]).cumsum() 

Это возвращает результат точно в запрошенном формате.

Для тех, кто ищет простой cumsum в группе Pandas, вы можете использовать:

 data1.groupby(['Bool', 'Dir']).apply(lambda x: x['Data'].cumsum()) 

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

 Bool Dir NE 2000-12-30 5 2000-12-30 16 W 2001-01-02 7 2001-01-03 16 YE 2000-12-30 4 2001-01-03 12 W 2000-12-30 6 2000-12-30 16 Name: Data, dtype: int64 

Обратите внимание на повторяющиеся даты, но это делает строгую кумулятивную сумму, внутреннюю по отношению к строкам каждой группы, идентифицированной столбцами Bool и Dir.

  • Освободить дисковое пространство hdf5 после удаления таблицы или узла с помощью pytables или pandas
  • Невозможно преобразовать даты в datetime64
  • Как я могу получить элементарный логический NOT серии pandas?
  • graph-tool - чтение списков краев из pandas dataframe
  • Python Pandas: получить индекс строк, столбец которых соответствует определенному значению
  • Как перебирать строки в DataFrame в Pandas?
  • Почему мои панды roll () работают (apply), когда серия содержит коллекции?
  • Преобразование времени unix в удобочитаемую дату в pandas DataFrame
  • Удаление стоп-слов из фрейма данных
  • Как игнорировать ячейки в DataFrame, используя pandas и python?
  • Панды: самый быстрый способ разрешить IP-адрес страны
  •  
    Interesting Posts for Van-Lav

    Python для матрицы столбца с матричным значением соответствующим столбцом

    Каковы преимущества или различия в «assert False» и «self.assertFalse»,

    Как позволить другим запускать вашу программу Python без установки Python

    Переименуйте файл сценария в distutils

    Как я могу обойти эту проблему, создавая виртуальную среду с помощью Python с настраиваемой компоновкой?

    tkinter Radiobutton выбирается, когда мышь нависает над ним

    Возврат Нет, если ключ словаря недоступен

    Смутно о выборе между Python 2 и Python 3

    scikit-learn, добавлять функции к векторизованному набору документов

    CSV-файл с указанной запятой нельзя правильно разделить на Python

    саморегуляторный троичный

    Домашний пивоваренный врач предупреждает о /Library/Frameworks/Python.framework, даже с установленным Python пива

    Случайный модуль не работает. ValueError: пустой диапазон для randrange () (1,1, 0)

    Обновление клиентской страницы только в том случае, если новая запись поступает в базу данных в Django

    В pytest, как я могу выяснить, не прошел тест? (из «запроса»)

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