【问题标题】:Identify or count continuously repeated number (actually missing value: nan) in the list识别或统计列表中连续重复的数字(实际缺失值:nan)
【发布时间】:2013-02-08 03:52:30
【问题描述】:

基本上,我想确定数据集中的缺失值是否连续重复。如果数据集中存在无数重复的缺失值,我想知道每个连续重复的缺失值集的长度是否在一定数量以上。

例如:

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。

很抱歉我没有展示我的示例代码,但我是这方面的新手,我对编码一无所知。

非常感谢任何想法、帮助或提示。

【问题讨论】:

  • 您是真的使用'nan' 之类的字符串还是使用numpy.nan

标签: python run-length-encoding


【解决方案1】:

这看起来像是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'equality 测试替换为 math.isnan(key)

【讨论】:

  • 非常感谢。我试过后会告诉你的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    使用pyrle 来提高速度。在此解决方案中,我将 nan 替换为不在数据中的数字 (-42)。这是因为 nan 对于 rles 来说是一个困难的值,因为 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
    

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 2011-01-10
      • 2016-08-26
      • 2021-06-05
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多