如何在0-10,10-20,... 90-100范围内的每个分区获取计数

时间:2017-01-09 10:01:23

标签: python pandas numpy scipy

我的数据范围为1-100。我希望按以下范围计算这些数据。假设我有这些数据: <fieldset class="fieldset"> <legend class="legend">Product To Grade Mappings</legend> <table class="promo full-width alternate-rows"> <tr> <th> @Html.DisplayNameFor(model => model.IndexList[0].grade.GradeString) </th> <th class="center-text">Frequency </th> @if (Model.IndexList.Count > 0) { foreach (var code in Model.ProductCodes) { <th class="center-text" title="@Model.Size."> @Html.DisplayFor(m => code) </th> } } <th>Actions</th> </tr> 。我想获得这个:

[17, 30, 62 65, 92, 95, 98]

我想知道是否有pandas / numpy / spicy功能可以快速实现这一目标。我感谢任何帮助!

6 个答案:

答案 0 :(得分:5)

您可以cut使用value_counts

bins = np.arange(0,110,10)
s = pd.Series([17, 30, 62, 65, 92, 95, 98])
s1 = pd.cut(s, bins=bins)
print (s1.value_counts(sort=False))
(0, 10]      0
(10, 20]     1
(20, 30]     1
(30, 40]     0
(40, 50]     0
(50, 60]     0
(60, 70]     2
(70, 80]     0
(80, 90]     0
(90, 100]    3
dtype: int64

答案 1 :(得分:5)

这只是直方图,所以np.histogram(data, np.arange(0,101,10))[0]

答案 2 :(得分:2)

可以使用numpy.digitize并将该输出放入numpy.bincount

示例:

import numpy as np

a = np.array([9, 17, 30, 62, 65, 92, 95, 98])

bins = np.arange(0, 100, 10)
inds = np.digitize(a, bins) - 1

counts  = np.bincount(inds)
for r, count in zip(bins, counts):
    print((r, r+10), count)

这将返回所需的结果。 Numpy数字化基本上可以告诉您应该在单调增加或减少的数组中插入您的数字。如果你然后bincount你得到每个分区的计数。因为np.digitize返回i,所以bins[i-1] <= x < bins[i]需要减去一个以获得第一个bin(bin 0)的第一个值。

答案 3 :(得分:2)

非numpy解决方案,也许它看起来很蹩脚......使用collections.Counter并舍入:

from collections import Counter

a = [ 10,11,17, 30, 62, 65, 92, 95, 98,100]

# directly count using a generator comprehension instead of a loop
c = Counter(((i-1)//10)*10 for i in a)


for i in range(0,((max(a)+1)*10)//10,10):
    print("{}-{}: {}".format(i+1,i+10,c[i] if i in c else 0))

基本上计算每次出现次数,然后打印所有值,如果不在字典中,则打印0:注意它不计算0或负数。

结果(通过添加1来改变输入数据和边界,因为它不明确):

1-10: 1
11-20: 2
21-30: 1
31-40: 0
41-50: 0
51-60: 0
61-70: 2
71-80: 0
81-90: 0
91-100: 4
101-110: 0

答案 4 :(得分:2)

您可以使用内置bisect模块实现此目的:

from bisect import bisect

my_list = [17, 30, 62, 65, 92, 95, 98]  # sort it if not already sorted
my_interval = list(range(0, 101, 10))

new_list = [((i+1, j), len(my_list[bisect(my_list, i+1):bisect(my_list, j)])) \
    for i, j in zip(my_interval, my_interval[1:])]

最终值hold为new_list将是:

[((0, 10), 0), ((10, 20), 1), ((20, 30), 1), ((30, 40), 0), ((40, 50), 0), ((50, 60), 0), ((60, 70), 2), ((70, 80), 0), ((80, 90), 0), ((90, 100), 3)]

要以所需格式打印值,请执行以下操作:

for (i, j), val in new_list:
    print '{}-{}: {}'.format(i, j, val)

将打印:

1-10: 0
11-20: 1
21-30: 1
31-40: 0
41-50: 0
51-60: 0
61-70: 2
71-80: 0
81-90: 0
91-100: 3

答案 5 :(得分:2)

<a-entity foo='jsonData: {"coordinates": [{"x": 0, "y": 1, "z": 2}]}'></a-entity>