使用 int8 列检查熊猫数据帧中的 NaN 值



正如我上周提出的一个问题中所提出的那样,存储具有[True, False, NaN]范围内的值的列的一种内存高效方法是使用int8-数据类型将True表示为1False表示为0NaN表示为-1

如果我这样做,"重新定义"pandas的isnull()方法的好做法是什么,同时考虑到,如果数据帧中的列具有dtypeint8-1应被视为空值。我可以考虑定义一个新的函数def isnull(v),如果值为 NaN,则返回,或者在 dtypeint8的情况下返回 -1,但我可以想象这将不是一个非常快速有效的解决方案(鉴于我正在使用的数据帧是几千兆字节大,我希望能够计算列/数据帧中"null"值的数量(。

它应该很快...

100.000.000 行系列的计时。

In [84]: s = pd.Series(np.random.choice([1,0,-1], 10**8), dtype=np.int8)
In [85]: s.shape
Out[85]: (100000000,)

模拟series.isnull()

In [86]: %timeit s==-1
87 ms ± 3.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [87]: %timeit s.values==-1
84.1 ms ± 2.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [88]: %timeit np.where(s==-1)
546 ms ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [89]: %timeit np.where(s.values==-1)
531 ms ± 2.78 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

模拟:series.isnull().sum()

In [90]: %timeit (s==-1).sum()
1.39 s ± 38.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [91]: %timeit (s.values==-1).sum()
181 ms ± 1.88 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

PS请注意,对于计算(求和(它们,(s==-1).sum()(s.values==-1).sum()之间的差异非常明显

相关内容

  • 没有找到相关文章

最新更新