Фрейм данных Pandas, сброс cumsum на NAN

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я знаю, что этот вопрос существует, но я не могу найти ответа, достаточно простого для понимания и соответствующего моей проблеме. У меня есть столбец во фрейме данных, и я хочу сохранить текущую сумму (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
  

Ответ №1:

Используйте 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.


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

 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. Спасибо за ваш ответ, если бы у меня был 0 или любой другой символ вместо NAN, как бы это изменилось в коде

2. @Dan измените isna() на eq (значение).

Ответ №2:

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

Я удвоил 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