熊猫:由范围
问题描述:
分类列值我有一个数据帧,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等等。 我该怎么做?
答
使用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)
答
您能给我们Ë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
+0
我不知道数字化。真的很好 – Dark
礼貌upvote :-) pd.cut是做到这一点的政治正确的方式。 –
哈哈,你有时候会用很有趣的话。谢谢 – Dark
摆脱申请。使用'pd.cut(df.values.reshape(-1,),[ - 1,3,6,9],labels = [1,2,3])。codes.reshape(df.shape)'。然后将结果加载到数据框中。 –