Pandas dataframe, сброс суммы по NAN - PullRequest
1 голос
/ 13 марта 2019

Я знаю, что этот вопрос существует, но я не могу найти ни одного ответа, достаточно простого, чтобы понять и соответствовать моей проблеме.У меня есть столбец в кадре данных, и я хочу сохранить промежуточную сумму (cumsum) этого столбца, но сбрасывая значения NAN

 Index  s_number  s_cumsum
  0       1         1
  1       4         5
  2       6         11
  3       Nan       0
  4       7         7
  5       2         9
  6       3         12

Ответы [ 2 ]

5 голосов
/ 13 марта 2019

Используйте groupby и cumsum:

df['s_cumsum'] = df.s_number.groupby(df.s_number.isna().cumsum()).cumsum()
df

   Index  s_number  s_cumsum
0      0       1.0       1.0
1      1       4.0       5.0
2      2       6.0      11.0
3      3       NaN       NaN
4      4       7.0       7.0
5      5       2.0       9.0
6      6       3.0      12.0

Обратите внимание, что если "s_number" является столбцом строк, используйте

df['s_number'] = pd.to_numeric(df['s_number'], errors='coerce)

... сначала, чтобы получить плавающую колонку с NaNs.


Если вы хотите заполнить NaN,

df['s_cumsum'] = (df.s_number.groupby(df.s_number.isna().cumsum())
                    .cumsum()
                    .fillna(0, downcast='infer'))
df

   Index  s_number  s_cumsum
0      0       1.0         1
1      1       4.0         5
2      2       6.0        11
3      3       NaN         0
4      4       7.0         7
5      5       2.0         9
6      6       3.0        12
1 голос
/ 13 марта 2019

Превратите NaN в отрицательную совокупность предыдущих значений, затем она будет сброшена в 0 при NaN.

Я удвоил df, чтобы показать, как это работает.

for i in df.loc[np.isnan(df['s_number'])].index:
    df['s_number'] = -sum(df[:i])
df['cumsum'] = df['s_number'].cumsum()

    index  s_number  s_cumsum
0       0       1.0         1
1       1       4.0         5
2       2       6.0        11
3       3     -11.0         0
4       4       7.0         7
5       5       2.0         9
6       6       3.0        12
7       0       1.0        13
8       1       4.0        17
9       2       6.0        23
10      3     -23.0         0
11      4       7.0         7
12      5       2.0         9
13      6       3.0        12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...