识别或计数列表中连续重复的数字(实际上是缺失值:nan)

1 投票
3 回答
613 浏览
提问于 2025-04-17 15:11

基本上,我想知道数据集中缺失值是否是连续出现的。如果缺失值是连续出现的,我还想知道这些连续缺失值的长度是否超过某个特定的数字。

举个例子:

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。

很抱歉我没有展示我的示例代码,因为我在这个领域还是个新手,完全不知道该怎么编码。

任何想法、帮助或建议都非常感谢。

3 个回答

0

这里使用了 pyrle 来提高速度。在这个解决方案中,我把数据里的nan(缺失值)替换成一个不在数据里的数字(-42)。这是因为nan是个比较麻烦的值,因为在计算中 np.nan != np.nan,所以没有任何两个nan会被认为是连续的。

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
2

或者你可以试试这个,它更快:

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

这看起来是使用 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)

撰写回答