python - 使用 int8 列检查 Pandas 数据框中的 NaN 值

标签 python pandas null

正如在 question 中提出的那样我上周提出,一种存储值在 [True, False, NaN] 范围内的列的内存有效方法是使用 int8 数据类型来表示 True1False0NaN-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/

相关文章:

python - 单击按钮时程序运行一次,然后什么也不运行

python - 在没有登录的情况下使用 ssh-agent

python - Pandas:映射数据系列(浮点到字符串)而不删除尾随零

c - 用C程序从PostgreSQL中检索数据

c++ - 如何测试数组元素是否为空?

c# - asp net MVC3 回发时提交对象列表为空

python - 如何仅获取在 Pandas 中出现超过 X 次的那些值的虚拟值

python - LabelEncoder() 对于相同的输入返回不同的值?

python - 来自带有列表的字典的 Pandas DataFrame

python - 使用条件从索引 1 开始替换数据框中的所有列