正如在 question 中提出的那样我上周提出,一种存储值在 [True, False, NaN]
范围内的列的内存有效方法是使用 int8
数据类型来表示 True
为 1
,False
为 0
和 NaN
为 -1
.
如果我这样做,“重新定义”pandas 的 isnull()
方法是什么好的做法,以便还考虑到如果数据框中的列具有 dtype int8
, -1
应被视为空值。我可以考虑定义一个新函数 def isnull(v)
,如果值为 NaN 则返回,如果 dtype int8
则返回 -1,但我可以想象不会是一个非常快速和有效的解决方案(假设我正在使用的数据框有数 GB 大,并且我希望能够计算列/数据框中“空”值的数量)。
最佳答案
应该很快吧
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)
请注意,为了计算(求和)它们,(s==-1).sum()
和 (s.values==-1).sum 之间的区别()
非常明显
关于python - 使用 int8 列检查 Pandas 数据框中的 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50907996/