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]
添加回答
举报