Python 使用int8列检查dataframe中的NaN值

Python 使用int8列检查dataframe中的NaN值,python,pandas,null,Python,Pandas,Null,正如我上周提出的一个建议,存储值在[True,False,NaN]范围内的列的一种内存有效的方法是使用int8数据类型将True表示为1,False表示为0,NaN表示为-1 如果我这样做,那么重新定义pandas的isnull方法并考虑到如果数据帧中的列的数据类型为int8,-1应被视为空值,这将是一个很好的实践。我可以考虑定义一个新函数def isnullv,如果一个值为NaN,则返回该函数;如果数据类型为int8,则返回-1,但我可以想象,这将不是一个非常快速有效的解决方案,因为我使用的数

正如我上周提出的一个建议,存储值在[True,False,NaN]范围内的列的一种内存有效的方法是使用int8数据类型将True表示为1,False表示为0,NaN表示为-1


如果我这样做,那么重新定义pandas的isnull方法并考虑到如果数据帧中的列的数据类型为int8,-1应被视为空值,这将是一个很好的实践。我可以考虑定义一个新函数def isnullv,如果一个值为NaN,则返回该函数;如果数据类型为int8,则返回-1,但我可以想象,这将不是一个非常快速有效的解决方案,因为我使用的数据帧是多个千兆字节,并且我希望能够计算列/数据帧中的空值量

应该很快

100.000.000行系列的计时

模拟series.isnull:

模拟:series.isnull.sum:


PS请注意,对它们进行计数求和时,s==-1.sum和s.values==-1.sum之间的差异非常明显

应该非常快

100.000.000行系列的计时

模拟series.isnull:

模拟:series.isnull.sum:


PS请注意,在对它们进行计数求和时,s==-1.sum和s.values==-1.sum之间的差异非常明显

只是为了确认一下,您应该使用num\u null\u values=s.values===-1.sum。@FHTMitchell,是的,谢谢!我错过了最后一部分:我希望能够计算空值的数量。要确认,您需要使用num_null_values=s.values==-1.sum。@FHTMitchell,是的,谢谢!我错过了最后一部分:我希望能够计算空值的数量
In [84]: s = pd.Series(np.random.choice([1,0,-1], 10**8), dtype=np.int8)

In [85]: s.shape
Out[85]: (100000000,)
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)
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)