2 回答

TA貢獻1773條經驗 獲得超3個贊
這樣做的自然方法是將數據分成 5 個數量,然后根據這些數量將數據分成 bin。幸運的是,pandas 可以讓你輕松做到這一點:
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
另一種觀點——聚類
在上述方法中,我們將數據分成 5 個 bin,其中不同 bin 的大小相等。另一種更復雜的方法是將數據分成 5 個集群,并旨在使每個集群中的數據點盡可能彼此相似。在機器學習中,這被稱為聚類/分類問題。
一種經典的聚類算法是k-means。它通常用于具有多個維度(例如每月活動、年齡、性別等)的數據。因此,這是一個非常簡單的聚類案例。
在這種情況下,可以通過以下方式進行 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
輸出看起來像:
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
一些注意事項:
類別的標簽是隨機的。在這種情況下,標簽“2”指的是比級別“1”更高的活動。
我沒有將標簽從 0-4 遷移到 AE。這可以使用 pandas' 輕松完成map。

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