将数字切割成固定的桶

数据挖掘 Python r
2021-09-25 18:00:58

我正在尝试使用 Python/R 将数字数据放入固定数量的存储桶中。

我有 key:value 格式的数据{1 : 12.3, 2 : 4.7, 3 : 7.4, 4 : 15.9, ......, 50 : 24.1},也就是device_id:data_usages我需要根据 value 分桶到九个桶(1,5,25,50,150,250,1000,5000,10000)中,所以稍后我可以看到哪些数据点在哪个桶中。

什么函数可以在 Python OR R 中做到这一点?

2个回答

你真的不需要实现一个算法来实现这一点。有一些工具可以为您做到这一点。

您可以使用 Pandas 获取分配给存储桶的数据以进行进一步处理,或者使用 NumPy 简单地计算每个存储桶中有多少值。

分配给存储桶

您只需要使用您的数据创建一个 Pandas DataFrame,然后调用方便的cut函数,该函数会将每个值放入您定义的存储桶/箱中。从文档中:

cut当您需要将数据值分段和排序到 bin 中时使用。

In [1]: import pandas as pd
In [2]: import numpy as np    # to create dummy data

创建一些虚拟数据,将其放入数据框中并定义箱:

In [3]: data = np.random.randint(low=1, high=10001, size=1000)                 
In [4]: df = pd.DataFrame(data=data, columns=["data"])
In [5]: bins = np.array([1,5,25,50,150,250,1000,5000,10000])

将数据与 bin 定义一起传递给cut函数,并将其作为数据框中的新列重新分配:

In [6]: df["bucket"] = pd.cut(df.data, bins)

然后,您可以检查前几行以查看这些值现在已用相关存储桶标记:

In [7]: df.head()                                                              
Out[7]: 
   data         bucket
0  8754  (5000, 10000]
1  2970   (1000, 5000]
2  6778  (5000, 10000]
3  2550   (1000, 5000]
4  5226  (5000, 10000]

计算每个桶中有多少

这是一个使用 NumPy 的示例,用于了解分布,作为histogram

使用上面定义的dataand ,我们将它们传递给 numpy函数,该函数将计算有多少数据点落入每个 bin 中:binshistogram

In [8]: np.histogram(data, bins)
Out[8]: 
(array([  0,   2,   1,   8,   6,  61, 417, 505]),
 array([    1,     5,    25,    50,   150,   250,  1000,  5000, 10000]))

第一行告诉您每个 bin 中有多少值,第二行确认使用的 bin。


通过执行以下操作,您可以将数据字典转换为与我上面的虚拟数据相同的形式(转换为 numpy 数组):

data = np.array([v for v in your_dict.values()])

这是使用bisect Python 标准库的解决方案

from bisect import bisect
from random import sample

data = sample(range(10_000), 1_000)

breakpoints = [1, 5, 25, 50, 150, 250, 1_000, 5_000, 10_000]
buckets = {}

for i in data:
    buckets.setdefault(breakpoints[bisect(breakpoints, i)], []).append(i)

这将产生一个包含键的字典breakpoints和每个键的数据点(值)列表。