DataFrame: накопленная сумма столбца, пока условие не будет достигнуто, и сумма возврата в новом столбце. - PullRequest
1 голос
/ 08 апреля 2020

Я новичок в Python и в настоящее время сталкиваюсь с проблемой, которую не могу решить. Я действительно надеюсь, что вы можете помочь мне. Английский sh не является моим родным языком, поэтому мне жаль, если я не могу express правильно себя.

Предположим, у меня есть фрейм данных как:

import pandas as pd
df = pd.DataFrame({'a': [1111,2222,3333,4444,5555,6666,7777,8888,9999], 'b':[0,0,1,0,1,0,0,0,1]})

I необходимо суммировать данные в «а», пока не будет достигнуто условие «есть значение в б». Это означает, что для данного Фрейма данных:

At index=2 there is a 1 in b --> sum rows 0+1+2 = 6666
At index=4 there is a 1 in b --> sum rows 3+4 = 9999
At index=8 there is a 1 in b --> sum rows 5+6+7+8 = 33330

Я пытался, если еще, но без удовлетворительного вывода ..

приветствия

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Выполнение:

df.a.groupby(df.b[::-1].cumsum()).sum()\
    .sort_index(ascending=False).reset_index(drop=True).to_frame()

Обратите внимание, что группировка выполняется в в обратном порядке из b , поэтому, глядя на этот столбец в «прямом» порядке, каждое значение 1 завершает текущую группу.

Шаги "постобработки" включают:

  • обратный порядок (по индексу),
  • сброс индекса,
  • преобразование в фрейм данных (если вам нужно).
1 голос
/ 08 апреля 2020

Используйте Series.shift с совокупной суммой Series.cumsum и затем агрегируйте sum:

df = df.groupby(df.b.shift(fill_value=0).cumsum())['a'].sum().rename_axis(None).to_frame()
print (df)
       a
0   6666
1   9999
2  33330

Для нового столбца используйте GroupBy.transform сначала с sum, а затем 0 при отсутствии совпадения 1 в b с numpy.where:

s = df.groupby(df.b.shift(fill_value=0).cumsum())['a'].transform('sum')
df['cumsum'] = np.where(df.b == 1, s, 0)

print (df)
      a  b  cumsum
0  1111  0       0
1  2222  0       0
2  3333  1    6666
3  4444  0       0
4  5555  1    9999
5  6666  0       0
6  7777  0       0
7  8888  0       0
8  9999  1   33330
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...