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

熊猫数据帧阈值--如果超过,则保持数字固定

  •  2
  • user44840  · 技术社区  · 7 年前

    从第1天到第7天,我有一个包含三个人(约翰、特里、亨利)的数据框。

              1     2     3     4     5     6      7
    John    1.3   2.8   3.0   4.4   2.6   3.1    4.8
    Terry   1.1   2.3   4.1   5.5   3.7   2.1    3.8
    Henry   0.3   1.0   2.0   3.0   2.7   1.1    2.8
    

    我如何设置这样的分数上限 一旦得分达到>2.5,从那天起,无论分数是多少,所有分数都是固定的

    输出应为:

              1     2     3     4     5     6      7
    John    1.3   2.8   2.8   2.8   2.8   2.8    2.8
    Terry   1.1   2.3   4.1   4.1   4.1   4.1    4.1
    Henry   0.3   1.0   2.0   3.0   3.0   3.0    3.0
    

    尝试以下操作无效。我首先对所有数字进行布尔运算>2.5至“1”,然后对累积总和应用掩码:

    df = df.mask((df > 2.5).cumsum(axis=1) > 0, df)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   jezrael    7 年前

    您可以找到第一个非 NaN 价值依据 where 具有 bfill 并按选择第一列 iloc :

    m = (df > 2.5).cumsum(axis=1) > 0
    
    s = df.where(m).bfill(axis=1).iloc[:, 0]
    print (s)
    John     2.8
    Terry    4.1
    Henry    3.0
    Name: 1, dtype: float64
    
    df = df.mask(m, s, axis=0)
    

    shift 遮罩和正向填充 南安 s到最后一个值:

    m = (df > 2.5).cumsum(axis=1) > 0
    df = df.mask(m.shift(axis=1).fillna(False)).ffill(axis=1)
    print (df)
             1    2    3    4    5    6    7
    John   1.3  2.8  2.8  2.8  2.8  2.8  2.8
    Terry  1.1  2.3  4.1  4.1  4.1  4.1  4.1
    Henry  0.3  1.0  2.0  3.0  3.0  3.0  3.0