亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 生成特定長度的唯一范圍并對其進行分類

Python 生成特定長度的唯一范圍并對其進行分類

暮色呼如 2022-12-06 16:45:57
我有一個數據框列,它指定用戶執行某項活動的次數。例如。>>> df['ActivityCount']Users     ActivityCountUser0     220User1     190User2     105User3     109User4     271User5     265     ...User95     64User96     15User97    168User98    251User99    278Name: ActivityCount, Length: 100, dtype: int32>>> activities = sorted(df['ActivityCount'].unique())[9, 15, 16, 17, 20, 23, 25, 26, 28, 31, 33, 34, 36, 38, 39, 43, 49, 57, 59, 64, 65, 71, 76, 77, 78,83, 88, 94, 95, 100, 105, 109, 110, 111, 115, 116, 117, 120, 132, 137, 138, 139, 140, 141, 144, 145, 148, 153, 155, 157, 162, 168, 177, 180, 182, 186, 190, 192, 194, 197, 203, 212, 213, 220, 223, 231, 232, 238, 240, 244, 247, 251, 255, 258, 260, 265, 268, 269, 271, 272, 276, 278, 282, 283, 285, 290]根據他們的 ActivityCount,我必須將用戶分為 5 個不同的類別,例如A, B, C, D和E?;顒佑嫈捣秶粫r變化。在上面的例子中,它大約在中間(9-290)(系列的最低和最高),它可以是(5-500)or (5 to 30)。在上面的示例中,我可以將活動的最大數量除以 5,然后將每個用戶分類在 58 的范圍內,例如(from 290/5),Range A: 0-58...等Range B: 59-116Range C: 117-174有沒有其他方法可以使用 pandas 或 numpy 實現此目的,以便我可以直接對給定類別中的列進行分類?預期輸出:->>> dfUsers     ActivityCount  Category/Range User0     220             DUser1     190             DUser2     105             B User3     109             BUser4     271             E  User5     265             E     ...User95     64             BUser96     15             AUser97    168             CUser98    251             EUser99    278             E
查看完整描述

2 回答

?
慕容3067478

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。


查看完整回答
反對 回復 2022-12-06
?
慕尼黑的夜晚無繁華

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]


查看完整回答
反對 回復 2022-12-06
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號