Использование 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.

  • Изменение формы расколотого панда
  • Группа Панда и сумма
  • возвращать строки с уникальными парами по столбцам
  • Pandas: флаг последовательных значений
  • Планирование плотности событий в Python с ggplot и pandas
  • Zipline: использование pandas-datareader для подачи данных в Google Finance для нефинансовых финансовых рынков
  • Seaborn, показывающий научную нотацию в тепловой карте для трехзначных чисел
  • Pandon pandas: объединить два фрейма данных по индексу даты и общее значение столбца
  • Python - лучший язык программирования в мире.