cumsum reset на NaN_2 - PullRequest
       3

cumsum reset на NaN_2

4 голосов
/ 13 июля 2020

У меня есть фрейм данных, который я создал путем объединения нескольких фреймов данных, содержащих различные биты информации. Затем я создаю новые столбцы в фрейме данных с результатом операций над столбцами данных. один из столбцов ['MSD'] содержит NaN на стыке между каждым из фреймов данных, которые способствовали конкатенации.

I wi sh, чтобы создать новый столбец MSD_cum, где каждое значение является совокупная сумма MSD, но я хочу, чтобы совокупная сумма начиналась заново с каждого NaN`.

Уже есть вопрос об этом, но хотя код в предоставленных ему ответах выполняется без ошибок, ни один из них на самом деле делаю то, что я хочу ie.

MSD 
1
2
3
4
NaN
1
2
3

создаст результат

MSD_cum
1
3
6
10
NaN
1
3
6

Вместо этого они дают то же, что и входные, или мои собственные первоначальные попытки, которые также потерпели неудачу и дали тот же результат, что и входные, пытались использовать оператор if, чтобы сделать cumsum обусловленным разницей между индексами данных.

if  np.diff(data_230['time']) is 1:
data_230['MSD_cum']  = cumsum(data_230['MSD'])
else:
    data_230['MSD_cum'] = data_230['MSD']

Я был бы доволен любым подходите к этому моменту.

1 Ответ

4 голосов
/ 13 июля 2020

Используйте Series.isna с Series.cumsum для создания группирующей серии s, это потребуется для группировки столбца MSD, чтобы мы могли вычислить cumsum, который сбрасывается при каждом возникновении NaN в MSD, затем используйте Series.groupby, чтобы сгруппировать столбец MSD в s вместе с cumsum:

s = df['MSD'].isna().cumsum()
df['MSD_cum'] = df['MSD'].groupby(s).cumsum()

Подробнее:

# print(s)   
0    0
1    0
2    0
3    0
4    1
5    1
6    1
7    1
Name: MSD, dtype: int64

# print(df)
   MSD  MSD_cum
0  1.0      1.0
1  2.0      3.0
2  3.0      6.0
3  4.0     10.0
4  NaN      NaN
5  1.0      1.0
6  2.0      3.0
7  3.0      6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...