如果值在特定范围内,我如何替换数据框中的值?
即我想替换所有值 0<i<=0.01
三颗星,0.01<i<=0.05
有两颗星和0.05<i<=0.1
一颗星。
这是我的数据框:
C=pd.DataFrame({'A':[0.0001,0.01,0.025,0.05,0.075,0.1], 'B':[0.0001,0.01,0.025,0.05,0.075,0.1]})
首先我尝试使用以下方法替换值:
C[((C.loc[:,:]<=0.01) & (C.loc[:,:]>0))]='***'
C[((C.loc[:,:]<=0.05) & (C.loc[:,:]>0.01))]='**'
C[((C.loc[:,:]<=0.1) & (C.loc[:,:]>0.05))]='*'
但是这个操作只能执行一次。一旦数据框中有字符串,<=
运算符不再工作并产生此错误
'<=' not supported between instances of 'str' and 'float'
所以我想我可以创建一个 for 循环,但是我在为范围建模时遇到了问题,因为 range()
只接受整数作为输入值。然后我尝试用 np.arange()
修复它.因为我不知道步长,所以我不能将它作为输入参数放在 np.arange()
中。 ,但是用非常小的步长进行试验,有一个奇怪的行为,即我做了:
for index,rows in C.iterrows():
for i in rows:
if i in np.arange(0,0.011, 0.00001):
C=C.replace(i,'***')
elif i in np.arange(0.05,0.1, 0.000001) :
C=C.replace(i,'**')
C
输出为:
A B
0 *** ***
1 *** ***
2 0.025 0.025
3 ** **
4 0.075 0.075
5 0.1 0.1
所以它适用于整个 if 语句,但仅适用于受 elif 语句影响的第一个值。请帮忙,我怎样才能做到这一点?
最佳答案
按照@QuangHoang 的建议将数据帧转换为数字,发布这个你可以尝试使用 np.select()
:
c1=C.le(.01)
c2=C.gt(.01)&C.le(.05)
c3=C.gt(.05)&C.le(.1)
s=np.select([c1,c2,c3],['***','**','*'])
C[:]=s
print(C)
A B
0 *** ***
1 *** ***
2 ** **
3 ** **
4 * *
5 * *
关于python - 如果数据框中的十进制值适合一个范围,则用不同的字符串替换它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57186824/