Python 生成特定长度的唯一范围并对其进行分类

我有一个数据框列,它指定用户执行某项活动的次数。例如。


>>> df['ActivityCount']

Users     ActivityCount

User0     220

User1     190

User2     105

User3     109

User4     271

User5     265

     ...

User95     64

User96     15

User97    168

User98    251

User99    278

Name: 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。活动计数范围不时变化。在上面的例子中,它大约在中间(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 实现此目的,以便我可以直接对给定类别中的列进行分类?预期输出:-


>>> df

Users     ActivityCount  Category/Range 

User0     220             D

User1     190             D

User2     105             B 

User3     109             B

User4     271             E  

User5     265             E

     ...

User95     64             B

User96     15             A

User97    168             C

User98    251             E

User99    278             E


暮色呼如
浏览 115回答 2
2回答

慕容3067478

这样做的自然方法是将数据分成 5 个数量,然后根据这些数量将数据分成 bin。幸运的是,pandas 可以让你轻松做到这一点:df["category"] = pd.cut(df.Activity, 5, labels= ["a","b", "c", "d", "e"])输出类似于:    Activity Category34       115        b15        43        a57       192        d78       271        e26        88        b6         25        a55       186        d63       220        d1         15        a76       268        e另一种观点——聚类在上述方法中,我们将数据分成 5 个 bin,其中不同 bin 的大小相等。另一种更复杂的方法是将数据分成 5 个集群,并旨在使每个集群中的数据点尽可能彼此相似。在机器学习中,这被称为聚类/分类问题。一种经典的聚类算法是k-means。它通常用于具有多个维度(例如每月活动、年龄、性别等)的数据。因此,这是一个非常简单的聚类案例。在这种情况下,可以通过以下方式进行 k-means 聚类:import scipyfrom scipy.cluster.vq import vq, kmeans, whitendf = 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  Category40       138         179       272         072       255         013        38         341       139         165       231         026        88         259       197         476       268         045       145         1一些注意事项:类别的标签是随机的。在这种情况下,标签“2”指的是比级别“1”更高的活动。我没有将标签从 0-4 迁移到 AE。这可以使用 pandas' 轻松完成map。

慕尼黑的夜晚无繁华

尝试以下解决方案: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]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python