Определить или сосчитать постоянно повторяющееся число (фактически отсутствует значение: nan) в списке

В основном, я хотел бы определить, постоянно ли повторяются отсутствующие значения в наборе данных или нет. Если в наборе данных есть бесконечно повторяющиеся пропущенные значения, я хотел бы знать, превышают ли длины каждого непрерывно повторяющегося набора пропущенных значений определенное число или нет.

Например:

data =['1', '0', '9', '31', '11', '12', 'nan', '10', '44', '53', '12', '66', '99', '3', '2', '6.75833',....., 'nan', 'nan', 'nan', '3', '7', 'nan', 'nan']

В data выше, общее количество 'nan' будет 6, и это можно рассчитать с data.count('nan'), Тем не менее, я хочу знать, насколько постоянно пропущенное значение может повторяться. Для этих данных ответом будет 3.

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

Любая идея, помощь или советы будут очень признательны.

2 ответа

Решение

Это похоже на работу для itertools.groupby ():

>>> from itertools import groupby
>>> data =['1', '0', '9', '31', '11', '12', 'nan', '10', '44', '53', 
           '12', '66', '99', '3', '2', '6.75833', 'nan', 'nan', 'nan', 
           '3', '7', 'nan', 'nan']
>>> [len(list(group)) for key, group in groupby(data) if key == 'nan']
[1, 3, 2]

Обратите внимание, если ваш код на самом деле имеет реальные NaN вместо строк, if key == 'nan'тест на равенство должен быть заменен math.isnan(key),

Или вы можете попробовать этот, который быстрее:

grouped_L = [sum(1 for i in group) for k,group in groupby(L)]

Использование пирла для скорости. В этом решении я заменяю nan на число, которого нет в данных (-42). Это связано с тем, что nan - трудное значение для rles, посколькуnp.nan != np.nan и, следовательно, никакие nans не считаются последовательными.

import numpy as np

data =['1', '0', '9', '31', '11', '12', 'nan', '10', '44', '53', '12', '66', '99', '3', '2', '6.75833', 'nan', 'nan', 'nan', '3', '7', 'nan', 'nan']
arr = np.array([np.float(f) for f in data])
assert not -42 in arr


from pyrle import Rle

r = Rle(arr)
arr[np.isnan(arr)] = -42
is_nan = r.values == -42
np.max(r.runs[is_nan])
# 3
Другие вопросы по тегам