使用之前的检查行覆盖 Dataframe 中的值

Overwrite Value in Dataframe with checking Line before

所以 DataFrame 是:

1 28.3  
2 27.9  
3 22.4  
4 18.1  
5 15.5  
6 7.1  
7 5.1   
8 12.0   
9 15.1  
10 10.1

现在我想用 HSE 替换所有超过 25 的,用 LSE 替换所有低于 25 的。其他都是 "Middle"。但我想知道在它得到 "Middle" 之前它是超过 25 还是低于 8。因此,如果在我将值替换为 "fHtM" 之前超过 25,如果在我将值替换为 "fLtM".

之前低于 8

提前致谢。

期望的输出:

可能是这样的:

1 S4  
2 S4  
3 S4  
4 dS3 (down to class S3)  
5 dS3  
6 dS2  
7 dS1  
8 uS2 (up to class S2)  
9 uS3  
10 dS2  

您可以使用 cut:

bins = [-np.inf, 6, 13, 19, np.inf]
labels=['S1','S2','S3','S4']
df['label'] = pd.cut(df['value'], bins=bins, labels=labels)
print (df)
    a  value label
0   1   28.3    S4
1   2   27.9    S4
2   3   22.4    S4
3   4   18.1    S3
4   5   15.5    S3
5   6    7.1    S2
6   7    5.1    S1
7   8   12.0    S2
8   9   15.1    S3
9  10   10.1    S2

如果需要添加趋势,使用diff:

解释:

首先从第label列中的第二个字符中得到str[1],将其转换为int个数字并计数diff。如果重复,您会得到 0,因此需要将它们替换为 NaN 并向前填充 ffill()

dif = (df.label.str[1].astype(int).diff().replace(0,np.nan).ffill())
print (dif)
0    NaN
1    NaN
2    NaN
3   -1.0
4   -1.0
5   -1.0
6   -1.0
7    1.0
8    1.0
9   -1.0
Name: label, dtype: float64

然后使用 numpy.where 创建 u,其中值为 1d 其中 -1 和空字符串(如果添加了其他内容)列 label.

df['label1'] = dif.where(dif.isnull(), np.where(dif == 1.0, 'u','d')).fillna('') + df.label.astype(str)

print (df)
    a  value label
0   1   28.3    S4
1   2   27.9    S4
2   3   22.4    S4
3   4   18.1   dS3
4   5   15.5   dS3
5   6    7.1   dS2
6   7    5.1   dS1
7   8   12.0   uS2
8   9   15.1   uS3
9  10   10.1   dS2