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

2024-09-27 07:24:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe列,指定用户执行活动的次数。 例如

>>> 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]

根据他们的活动计数,我必须将用户分为5个不同的类别,例如A, B, C, DE。 活动计数范围因时间而异。在上面的例子中,它大约在(9-290)(系列中最低和最高的)之间,它可以是(5-500)(5 to 30)。 在上面的示例中,我可以将活动的最大数量除以5,并将每个用户分类为58(from 290/5)的范围,如Range A: 0-58Range 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

Tags: 用户dfrangeusersuser1user2user0user4
2条回答

实现这一点的自然方法是将数据分成5个数量,然后根据这些数量将数据分成多个容器。幸运的是,熊猫可以让你轻松做到这一点:

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个存储单元,其中不同存储单元的大小相等。另一种更复杂的方法是将数据分成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迁移到A-E。这可以使用pandas map轻松完成

请尝试以下解决方案:

df['Categ'] = pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'))

它创建Categ列-这是对ActivityCount 放入5个箱子中,标有AE

通过将整个范围划分为n子范围来设置箱子的边界 大小相等

您还可以查看每个箱子的边框,调用:

pd.cut(df.ActivityCount, bins=5, labels=list('ABCDE'), retbins=True)[1]

相关问题 更多 >

    热门问题