首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中通过变量中的不同值来创建bin?

如何在python中通过变量中的不同值来创建bin?
EN

Stack Overflow用户
提问于 2015-04-03 22:07:49
回答 3查看 251关注 0票数 0

我有一个类似下面的数据集,我想通过使用smstext的值将它们放入不同的bin中

二进制数据

代码语言:javascript
复制
  userid      smstext
0 vodafone     56
1 airtel       101
2 reliance     505
3 tata         1500
4 mts          10

我需要的是,如果短信文本值在0-10之间,二进制名应该是10,如果短信文本值在11-50之间,二进制名应该是50,如果短信文本值在51-100之间,二进制名应该是100,如果短信文本值在101-500之间,二进制名应该是500,如果短信文本值在500-1000之间,二进制名应该是1000,如果短信文本值在1000以上,二进制名应该是1001。

预期输出:

二进制数据

代码语言:javascript
复制
  userid      smstext   bin
0 vodafone     56       100
1 airtel       101      500
2 reliance     505      1000
3 tata         1500     1001
4 mts          10        10

我可以通过使用np.where和np.logical来解决,但我需要一个简单的方法来在python.please中做上面的事情,帮我解决这个问题。

EN

回答 3

Stack Overflow用户

发布于 2015-04-03 22:41:10

将smstext的一个值转换为bin的代码如下

代码语言:javascript
复制
def convert_to_bin(v, bins, other):
    for b in bins:
        if v <= b:
            return b

    return other

并且可以被调用(对于您的值)为

代码语言:javascript
复制
convert_to_bin(somevalue, [10, 50, 100, 1000], 1001)

下面是一些例子:

代码语言:javascript
复制
In [5]: convert_to_bin(1, [10, 50, 100, 1000], 1001)
Out[5]: 10

In [6]: convert_to_bin(51, [10, 50, 100, 1000], 1001)
Out[6]: 100

In [7]: convert_to_bin(31, [10, 50, 100, 1000], 1001)
Out[7]: 50

In [8]: convert_to_bin(2031, [10, 50, 100, 1000], 1001)
Out[8]: 1001

然后,您只需将结果添加到数据集中。

票数 1
EN

Stack Overflow用户

发布于 2015-04-03 23:11:40

看看itertools.groupby吧。

代码语言:javascript
复制
import itertools

for dataInGroup, group in itertools.groupby(dataToBeGrouped, grouperFunction):
  print group, dataInGroup

groupby接受一个函数,该函数确定数据项的组,然后返回一个迭代器,该迭代器循环遍历每个组标签和该组中的项。

票数 0
EN

Stack Overflow用户

发布于 2015-04-04 04:41:34

我刚接触pandas,但似乎你想要cut函数。

代码语言:javascript
复制
smstext = np.array([56, 101, 505, 1500, 10])
bins = pd.cut(smstext, [0, 11, 51, 101, 501, 1000, float('inf')], 
    right=False, labels=[10, 50, 100, 500, 1000, 1001])

这将返回

代码语言:javascript
复制
  100
  500
 1000
 1001
   10

如果出于某种原因,你想自己编写这个函数,而不是使用pandas,它将如下所示:

代码语言:javascript
复制
def cut(iter, bins):
    def categorise(item):
        for right in bins:
            if item < right:
                return right - 1
        return bins[-1]

    return [categorise(item) for item in iter]

print(cut(smstext, [0, 11, 51, 101, 501, 1001]))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29433757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档