【问题标题】:Checking NaN values in pandas dataframe with int8 columns使用 int8 列检查 pandas 数据框中的 NaN 值
【发布时间】:2018-06-18 11:01:36
【问题描述】:

正如我在上周提出的question 中提出的那样,存储具有[True, False, NaN] 范围内的值的列的一种内存有效方法是使用int8-datatype 将True 表示为@987654325 @、False 作为0NaN 作为-1

如果我这样做,“重新定义”pandas 的 isnull() 方法的好习惯是什么,还要考虑到,如果数据框中的列具有 dtype int8-1 应该被视为 null -价值。我可以考虑定义一个新函数def isnull(v),如果值为 NaN,则返回 -1,如果是 dtype int8,但我可以想象这不会是一个非常快速和有效的解决方案(假设数据框我正在使用的是数 GB 大,我希望能够计算列/数据帧中“空”值的数量)。

【问题讨论】:

    标签: python pandas null


    【解决方案1】:

    应该很快……

    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() 之间的差异非常明显

    【讨论】:

    • 只是为了确认,你会使用num_null_values = (s.values == -1).sum()
    • @FHTMitchell,是的,谢谢!我错过了最后一部分:and I want to be able to count the amount of "null"-values
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2016-02-11
    • 2018-10-18
    • 1970-01-01
    • 2021-06-26
    • 2018-11-02
    • 2012-10-29
    相关资源
    最近更新 更多