Подсчет последовательных пропущенных значений (нан) в нескольких столбцах с условием - PullRequest
0 голосов
/ 01 апреля 2019

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

У меня есть этот df:

index                   a          b     c     reboot
2018-06-25 12:51:00    NaN        NaN   NaN     1      
2018-06-25 12:52:00    NaN        NaN   NaN     0    
2018-06-25 12:53:00    NaN        NaN   NaN     0  
2018-06-25 12:54:00    NaN        NaN   NaN     0    
2018-06-25 12:55:00    NaN        NaN   NaN     0    
2018-06-25 12:56:00    NaN        NaN   NaN     0   
2018-06-25 12:57:00    NaN        NaN   NaN     0   
2018-06-25 12:58:00    NaN        0.6   0.6     0
2018-06-25 12:59:00    NaN        NaN   0.5     0  
2018-06-25 13:00:00    NaN        NaN   0.3     0  
2018-06-25 13:01:00   2.55  94.879997  0.23     0
2018-06-25 13:02:00   1.17        Nan  0.13     0
2018-06-25 13:03:00   1.08  98.199997  0.10     0
2018-06-25 13:28:00    NaN        NaN   NaN     1  
2018-06-25 13:29:00    NaN        NaN   NaN     0     
2018-06-25 13:30:00    NaN        NaN   NaN     0
2018-06-25 13:31:00    NaN        NaN   NaN     0
2018-06-25 13:31:00    0.5        0.2   0.1     0
2018-06-25 13:32:00    NaN        NaN   NaN     0 
2018-06-25 13:33:00    NaN        NaN   NaN     0 
2018-06-25 13:34:00     3         0.6   0.5     0 

Я хочу посчитать строки, где a, b и c - все NaN и reboot == 1, с результатом в следующем виде:

index                    period      reboot
2018-06-25 12:51:00         7           1
2018-06-25 13:28:00         4           1

Я уже пытался сделать это столбец за столбцом без условия перезагрузки.

Введите:

index                   a          b     c     reboot
2018-06-25 12:51:00    NaN        NaN   NaN     1      
2018-06-25 12:52:00    NaN        NaN   NaN     0    
2018-06-25 12:53:00    NaN        NaN   NaN     0  
2018-06-25 12:54:00    NaN        NaN   NaN     0    
2018-06-25 12:55:00    NaN        NaN   NaN     0    
2018-06-25 12:56:00    NaN        NaN   NaN     0   
2018-06-25 12:57:00    NaN        NaN   NaN     0   
2018-06-25 12:58:00    NaN        NaN   NaN     0
2018-06-25 12:59:00    NaN        NaN   NaN     0  
2018-06-25 13:00:00    NaN        NaN   NaN     0  
2018-06-25 13:01:00   2.55  94.879997  0.23     0
2018-06-25 13:02:00   1.17        Nan  0.13     0
2018-06-25 13:03:00   1.08  98.199997  0.10     0
2018-06-25 13:28:00    NaN        NaN   NaN     1  
2018-06-25 13:29:00    NaN        NaN   NaN     0     
2018-06-25 13:30:00    NaN        NaN   NaN     0


a=df.index
b=df.b.values
idx0 = np.flatnonzero(np.r_[True, np.diff(np.isnan(b))!=0,True])
count = np.diff(idx0)
idx = idx0[:-1]
valid_mask = (count>=step) & np.isnan(b[idx])
out_idx = idx[valid_mask]
out_num = a[out_idx]
out_count = count[valid_mask]
outb = zip(out_num, out_count)
periodb=list(outb)

Результат:

'[(Timestamp('2018-06-25 12:51:00'), 10),
 (Timestamp('2018-06-25 13:28:00'), 3),'

1 Ответ

0 голосов
/ 01 апреля 2019

Добавьте еще один столбец с «нормальными» индексами (целые числа, начиная с 0), выберите интересующие строки, а затем найдите различия между соседними значениями в добавленном столбце - поскольку эти различия дадут вам расстояния между строками в исходных данных.

Что-то вроде:

numbered = df.assign(row=range(len(df)))
restarts = numbered[numbered.reboot == 1]
result = restarts.row.shift(-1) - restarts.row

(Читая немного более внимательно, кажется, что частью проблемы является только подсчет строк с NaN для всех значений a, b, c. Для этого отфильтруйте все другие строки сначала , перед добавлением столбца вторичного индекса.)

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