pandas заполнить в столбце с суммой предыдущих строк (сбрасывается после каждого нан) - PullRequest
2 голосов
/ 13 января 2020

Я нашел решение, которое решает эту проблему по строкам, но есть ли быстрый способ сделать это по столбцу?

Вот краткий пример кадра данных:

import pandas as pd
import numpy as np

df = pd.DataFrame([['GB',43.76],
['TEN',17.3],
['ARI',0.2],
['ATL',12.3],
['HOU',21.1],
['ARI',1.7],
['ATL',12.6],
['SF',15.0],
['GB',5.7],
[1.0,np.nan],
['GB',43.76],
['TEN',17.3],
['ARI',0.2],
['ATL',12.3],
['HOU',21.1],
['ARI',1.7],
['ATL',12.6],
['BUF',7.0],
['GB',5.7],
[2.0,np.nan]], columns = ['team','points'])

Я пытался манипулировать df['sum'] = df['points'].cumsum(). Очевидно, что он накапливает сумму, но мне нужно, чтобы он перезапустился, когда / если достигнет nan, вместо того, чтобы просто пропустить его.

Ответы [ 3 ]

4 голосов
/ 13 января 2020

Использовать GroupBy.cumsum с вспомогательной серией, созданной путем проверки пропущенного значения другим cumsum:

df['sum'] = df.groupby(df['points'].isna().cumsum())['points'].cumsum()
print (df)
   team  points     sum
0    GB   43.76   43.76
1   TEN   17.30   61.06
2   ARI    0.20   61.26
3   ATL   12.30   73.56
4   HOU   21.10   94.66
5   ARI    1.70   96.36
6   ATL   12.60  108.96
7    SF   15.00  123.96
8    GB    5.70  129.66
9     1     NaN     NaN
10   GB   43.76   43.76
11  TEN   17.30   61.06
12  ARI    0.20   61.26
13  ATL   12.30   73.56
14  HOU   21.10   94.66
15  ARI    1.70   96.36
16  ATL   12.60  108.96
17  BUF    7.00  115.96
18   GB    5.70  121.66
19    2     NaN     NaN
1 голос
/ 13 января 2020

Другим способом, не используя groupby и предполагая, что все точки являются положительными , вы можете сделать это с cumsum по точкам и ffill нан с предыдущим значением, затем удалить cummax значения, где баллы isna как:

df['s'] = df['points'].cumsum().ffill()
df['s'] -= (df['s']*df['points'].isna()).cummax()
print (df)
   team  points       s
0    GB   43.76   43.76
1   TEN   17.30   61.06
2   ARI    0.20   61.26
3   ATL   12.30   73.56
4   HOU   21.10   94.66
5   ARI    1.70   96.36
6   ATL   12.60  108.96
7    SF   15.00  123.96
8    GB    5.70  129.66
9     1     NaN    0.00
10   GB   43.76   43.76
11  TEN   17.30   61.06
12  ARI    0.20   61.26
13  ATL   12.30   73.56
14  HOU   21.10   94.66
15  ARI    1.70   96.36
16  ATL   12.60  108.96
17  BUF    7.00  115.96
18   GB    5.70  121.66
19    2     NaN    0.00
0 голосов
/ 13 января 2020

Не уверен, что это то же решение, что и у Джезраэль, но я бы предложил создать столбец, представляющий группы суммирования, как в этом вопросе , где вы проверяете np.nan вместо 0. Тогда делать кумулятивные суммы по этим группам суммирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...