使用之前的检查行覆盖 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
,其中值为 1
,d
其中 -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
所以 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".
提前致谢。
期望的输出:
可能是这样的:
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
,其中值为 1
,d
其中 -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