2 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
這樣做的自然方法是將數(shù)據(jù)分成 5 個(gè)數(shù)量,然后根據(jù)這些數(shù)量將數(shù)據(jù)分成 bin。幸運(yùn)的是,pandas 可以讓你輕松做到這一點(diǎn):
df["category"] = pd.cut(df.Activity, 5, labels= ["a","b", "c", "d", "e"])
輸出類似于:
Activity Category
34 115 b
15 43 a
57 192 d
78 271 e
26 88 b
6 25 a
55 186 d
63 220 d
1 15 a
76 268 e
另一種觀點(diǎn)——聚類
在上述方法中,我們將數(shù)據(jù)分成 5 個(gè) bin,其中不同 bin 的大小相等。另一種更復(fù)雜的方法是將數(shù)據(jù)分成 5 個(gè)集群,并旨在使每個(gè)集群中的數(shù)據(jù)點(diǎn)盡可能彼此相似。在機(jī)器學(xué)習(xí)中,這被稱為聚類/分類問(wèn)題。
一種經(jīng)典的聚類算法是k-means。它通常用于具有多個(gè)維度(例如每月活動(dòng)、年齡、性別等)的數(shù)據(jù)。因此,這是一個(gè)非常簡(jiǎn)單的聚類案例。
在這種情況下,可以通過(guò)以下方式進(jìn)行 k-means 聚類:
import scipy
from scipy.cluster.vq import vq, kmeans, whiten
df = pd.DataFrame({"Activity": l})
features = np.array([[x] for x in df.Activity])
whitened = whiten(features)
codebook, distortion = kmeans(whitened, 5)
code, dist = vq(whitened, codebook)
df["Category"] = code
輸出看起來(lái)像:
Activity Category
40 138 1
79 272 0
72 255 0
13 38 3
41 139 1
65 231 0
26 88 2
59 197 4
76 268 0
45 145 1
一些注意事項(xiàng):
類別的標(biāo)簽是隨機(jī)的。在這種情況下,標(biāo)簽“2”指的是比級(jí)別“1”更高的活動(dòng)。
我沒(méi)有將標(biāo)簽從 0-4 遷移到 AE。這可以使用 pandas' 輕松完成map。

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
嘗試以下解決方案:
df['Categ'] = pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'))
它創(chuàng)建Categ列 - 將ActivityCount 劃分為 5 個(gè)容器的結(jié)果,標(biāo)記為A , ... E。
通過(guò)將整個(gè)范圍劃分為n 個(gè)大小相等的子范圍來(lái)設(shè)置箱的邊界。
您還可以看到每個(gè)垃圾箱的邊界,調(diào)用:
pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'), retbins=True)[1]
添加回答
舉報(bào)