代码之家  ›  专栏  ›  技术社区  ›  iRoygbiv

用值列表作为条件屏蔽数据帧

  •  0
  • iRoygbiv  · 技术社区  · 7 年前

    我的数据帧包含多个时间序列,每当每个时间序列中的一个点超出平均值一个标准差时,我都要标记。

    df = pd.DataFrame(np.random.rand(3, 10), index=['ts_A', 'ts_B','ts_C'])
    
    std = df.std(axis=1)
    mean = df.mean(axis=1)
    

    然后我希望能够做到:

    df.mask(df > (std + mean), 'True', inplace=True)
    

    但是,对于每个元素,它都返回false。如果我使用df.where,则整个数据帧将填充True。

    我可以通过遍历索引并依次屏蔽每一行来做到这一点,但我相信一定有更好的方法。

    1 回复  |  直到 7 年前
        1
  •  2
  •   BENY    7 年前

    使用 gt 具有 axis=0

    df.mask(df.gt(std + mean,axis=0), 'True', inplace=True)
    df
                 0         1         2         3          4         5         6 
    ts_A  0.003797  0.060297  0.265496  0.442663       True  0.498443  0.436738   
    ts_B  0.127535  0.644332      True  0.079317  0.0411021      True  0.830672   
    ts_C  0.693698  0.429689  0.371802  0.312407  0.0555868      True      True   
                 7         8         9  
    ts_A  0.403529  0.392445  0.238355  
    ts_B  0.732539  0.030451  0.895976  
    ts_C  0.907143  0.912002  0.098821 
    

    如果需要,返回T和F

    TorF=df.gt(std + mean,axis=0)
    TorF
    Out[31]: 
              0      1      2      3      4      5      6      7      8      9
    ts_A  False  False  False  False   True  False  False  False  False  False
    ts_B  False  False   True  False  False   True  False  False  False  False
    ts_C  False  False  False  False  False   True   True  False  False  False