我有一个如下所示的数据集,我想通过使用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中做上面的事情。请帮助我这个......
答案 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]))