Pandas dataframe threshold - 如果超过,则保持数字固定

时间:2018-02-15 16:11:38

标签: python pandas numpy dataframe boolean

从第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)

1 个答案:

答案 0 :(得分:2)

您可以在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掩码和转发NaN到最后的值:

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