【问题标题】:Pandas: run length of NaN holesPandas:NaN 孔的运行长度
【发布时间】:2013-06-04 19:04:56
【问题描述】:

我有数百个时间序列对象,每个对象包含 100000 个条目。 某些百分比的数据条目丢失(NaN)。 对于我的应用程序来说,重要的是这些是单个、分散的 NaN 还是长序列的 NaN。

因此,我想要一个函数来给我每个连续的 NaN 序列的游程长度。 我可以的

myseries.isnull()

得到一系列布尔值。我可以做移动中位数或移动平均来了解数据洞的大小。 但是,如果有一种有效方法来获取系列的孔长度列表,那就太好了。

也就是说,最好有一个myfunc 这样

a = pdSeries([1, 2, 3, np.nan, 4, np.nan, np.nan, np.nan, 5, np.nan, np.nan])
myfunc(a.isnull())
==> Series([1, 3, 2])

(因为分别有 1、3 和 2 个 NaN)

据此,我可以制作孔长度的直方图,以及多个系列的 isnull 的 andor(可能是彼此的替代品),以及其他好东西。

我还想了解其他方法来量化数据漏洞的“块状”。

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    import pandas as pd
    import numpy as np
    import itertools
    
    a = pd.Series([1, 2, 3, np.nan, 4, np.nan, np.nan, np.nan, 5, np.nan, np.nan])
    len_holes = [len(list(g)) for k, g in itertools.groupby(a, lambda x: np.isnan(x)) if k]
    print len_holes
    

    结果

    [1, 3, 2]
    

    【讨论】:

    • Series([len(list(g)) for k, g in groupby(a.isnull()) if k]) 可能效率更高。
    • 啊,是的,'groupby'。我猜 groupby 是为了对排序的数据进行操作,但是当不先排序时,它让我得到了 RLE :)
    • 谢谢,JAB,我不知道 groupby 可以只接受一个参数。太好了,因为我的代码中已经计算了 a.isnull()
    • @JAB +1 是为了优雅,也是为了效率:使用你的方法我得到了 5 倍的加速(3.65ms vs 15.9ms)。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2013-02-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多