我有一个数据帧,df喜欢这个
a b c
1 0 2
5 7 8
4 1 3
3 4 6
5 2 5
.......
现在我想用以下范围替换这些数据
0-3 = 1
4-6 = 2
7-9 = 3
列值小于10,因此范围在0-9之内。
我想用范围类别替换上面的数据帧值,输出应该是这样的
a b c
1 1 1
2 3 3
2 1 1
1 2 2
2 1 2
.......
因此,如果df中的任何值在0-3之内,则应替换为1,如果4-6内的任何值将其替换为2,依此类推。 我怎么能这样做?
答案 0 :(得分:6)
将pd.cut
与apply
一起使用,即
df.apply(lambda x : pd.cut(x,[-1,3,6,9],labels=[1,2,3]))
a b c 0 1 1 1 1 2 3 3 2 2 1 1 3 1 2 2 4 2 1 2
@coldspeed建议的基于非应用的解决方案:
pd.DataFrame(pd.cut(df.values.reshape(-1,),[-1,3,6,9],labels=[1,2,3]).codes.reshape(df.shape)+1,columns=df.columns)
或
pd.DataFrame(pd.cut(np.hstack(df.values),[-1,3,6,9],labels=[1,2,3]).codes.reshape(df.shape)+1,columns=df.columns)
答案 1 :(得分:4)
使用一点mathemagic:
((df - 1) // 3).clip(0) + 1
a b c
0 1 1 1
1 2 3 3
2 2 1 1
3 1 2 2
4 2 1 2
或者,replace
全部用一个零(唯一要处理的角落情况)然后除以。
(df.replace(0, 1) - 1) // 3 + 1
a b c
0 1 1 1
1 2 3 3
2 2 1 1
3 1 2 2
4 2 1 2
答案 2 :(得分:2)
您可以使用np.digitize
In [5942]: bins = np.array([0, 4, 7, 10])
In [5943]: pd.DataFrame(np.digitize(df, bins), columns=df.columns)
Out[5943]:
a b c
0 1 1 1
1 2 3 3
2 2 1 1
3 1 2 2
4 2 1 2
或作为
In [5947]: bins2 = np.array([-1, 3, 6, 9])
In [5948]: pd.DataFrame(np.digitize(df, bins2, right=True), columns=df.columns)
Out[5948]:
a b c
0 1 1 1
1 2 3 3
2 2 1 1
3 1 2 2
4 2 1 2