2017-10-28 150 views
1

分類列值我有一個數據幀,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等等。 我該怎麼做?

回答

4

使用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)'。然後將結果加載到數據框中。 –

1

您能給我們Ë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

2

使用小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謝謝,善良的先生。感謝支持。 –