#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