如何在python中的变量中使用不同的值来创建bin?

时间:2015-04-03 14:07:49

标签: python pandas

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

bindata

  userid      smstext
0 vodafone     56
1 airtel       101
2 reliance     505
3 tata         1500
4 mts          10

我需要的是如果短信文本值在0-10之间,则binname应为10, 如果短信文本值在11-50之间,则bin名称应为50, 如果短信文本值在51-100之间,则binname应为100, 如果短信文本值在101-500之间,则binname应为500, 如果短信文本值在500-1000之间,则binname应为1000, 如果sms文本值大于1000,则binname应为1001。

预期产出:

bindata

  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中做上面的事情。请帮助我这个......

3 个答案:

答案 0 :(得分:1)

将smstext的一个值转换为其bin的代码将是

def convert_to_bin(v, bins, other):
    for b in bins:
        if v <= b:
            return b

    return other

可以被称为(对于你的价值观)

convert_to_bin(somevalue, [10, 50, 100, 1000], 1001)

一些例子:

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 :(得分:0)

看看itertools.groupby

import itertools

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

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

答案 2 :(得分:0)

我是熊猫新手,但似乎你想要cut功能。

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

返回

  100
  500
 1000
 1001
   10

如果由于某种原因你想自己编写这个函数而不是使用pandas,它看起来像这样:

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