为了账号安全,请及时绑定邮箱和手机立即绑定

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。活动计数范围不时变化。在上面的例子中,它大约在中间(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 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信