熊猫:由范围

问题描述:

分类列值我有一个数据帧,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.cutapply

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) 
+0

礼貌upvote :-) pd.cut是做到这一点的政治正确的方式。 –

+0

哈哈,你有时候会用很有趣的话。谢谢 – Dark

+0

摆脱申请。使用'pd.cut(df.values.reshape(-1,),[ - 1,3,6,9],labels = [1,2,3])。codes.reshape(df.shape)'。然后将结果加载到数据框中。 –

您能给我们Ë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

使用小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 
+0

是的,它的魔法我同意 – Dark

+1

不错的解决方案;) – jezrael

+0

@jezrael谢谢,善良的先生。感谢支持。 –