2017-02-22 67 views
1

我有一個有7列的熊貓數據框。對於其中的一列,我想將其內容劃分爲僅取決於值的n桶。所以,如果我的專欄的值爲1, 3, 5 ... (2*n+1),我添加了一個新的專欄作爲1,2,3...n將大熊貓數據框列分成n個桶

另外,我並不想正常化,即使我在列中有100個3,我希望他們在同一個桶中。所以,如果我有1, 3, 3, 3, 5, ... (2*n+1),我的輸出將是1, 2, 2, 2, 3, .. n

有人可以請指導我如何做到這一點。

- 編輯 -

我的實際數據有超過一百萬行。所以,如果我使用排名,我會得到1到100萬的排名。我想要的是將隊伍分成桶。舉個例子,如果我有300萬行,最後會有1到150萬的行列。如果我想把它分成3個桶,那麼先得到第一桶50萬桶,下一桶50桶,等等。同樣如果我想將它分成7個桶。

問候

+0

對不起,對我來說這是一個有點不清楚。你可以添加所需輸出的另一個樣本? – jezrael

+0

@jezrael,當然。所以如果輸入欄是'1,5,3,9,5,3,7,10',那麼輸出欄應該有'1,3,2,5,3,2,4,6'作爲輸出 – nimbus3000

回答

1

您需要rank

df = pd.DataFrame({'col':[1,5,3,9,5,3,7,10]}) 
print (df) 
    col 
0 1 
1 5 
2 3 
3 9 
4 5 
5 3 
6 7 
7 10 

df['col1'] = df.col.rank(method='dense').astype(int) 
print (df) 
    col col1 
0 1  1 
1 5  3 
2 3  2 
3 9  5 
4 5  3 
5 3  2 
6 7  4 
7 10  6 

編輯:我認爲你需要地板師//

n = 3 
df['col1'] = np.arange(len(df.index)) // n 
print (df) 
    col col1 
0 1  0 
1 7  0 
2 3  0 
3 3  1 
4 5  1 
5 7  1 
6 13  2 

如果單調遞增指數喜歡0,1,2...n

n = 3 
df['col1'] = df.index // n 
print (df) 
    col col1 
0 1  0 
1 7  0 
2 3  0 
3 3  1 
4 5  1 
5 7  1 
6 13  2 
+0

對不起,你需要'1,4,2,2,3,4,5'? – jezrael

+0

我刪除了我的評論,這是對您的第一個答案的迴應。我正在檢查這個反對我的投入! – nimbus3000

+0

沒問題,現在它得到您想要的輸出。 – jezrael

0

大熊貓具有功能cut()對於這種分級的:

data=pd.Series([1,3,3,3,5,7,13]) 
n_buckets = (data.max() - data.min()) // 2 + 1 
buckets = pd.cut(data, n_buckets, labels=False) + 1 
#0 1 
#1 2 
#2 2 
#3 2 
#4 3 
#5 4 
#6 7