我有一个类似下面的数据集,我想通过使用smstext的值将它们放入不同的bin中
二进制数据
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。
预期输出:
二进制数据
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中做上面的事情,帮我解决这个问题。
发布于 2015-04-03 22:41:10
将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然后,您只需将结果添加到数据集中。
发布于 2015-04-03 23:11:40
看看itertools.groupby吧。
import itertools
for dataInGroup, group in itertools.groupby(dataToBeGrouped, grouperFunction):
print group, dataInGroupgroupby接受一个函数,该函数确定数据项的组,然后返回一个迭代器,该迭代器循环遍历每个组标签和该组中的项。
发布于 2015-04-04 04:41:34
我刚接触pandas,但似乎你想要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]))https://stackoverflow.com/questions/29433757
复制相似问题