【问题标题】:Pandas dataframe threshold -- Keep number fixed if exceed熊猫数据框阈值——如果超过,保持数字固定
【发布时间】:2018-02-15 16:11:38
【问题描述】:

我有一个数据框,其中包含从第 1 天到第 7 天的三个人(John、Terry、Henry)的分数。

          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)

【问题讨论】:

    标签: python pandas numpy dataframe boolean


    【解决方案1】:

    您可以通过wherebfill 找到第一个非NaN 值,并通过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 掩码并将NaNs 前向填充到最后一个值:

    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
    

    【讨论】:

    • 第一种方法刚好填满 2.5
    • s 是什么?我添加它来回答。
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2018-07-23
    • 1970-01-01
    • 2023-02-16
    • 2018-09-20
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多