一个间隔中有多少数据?

时间:2019-07-09 11:40:43

标签: python pandas

我有一个列表对象,我想知道特定间隔内有多少个数字?代码如下

a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28]
interval = 3
a = list(map(lambda x:int(x/interval),a))
for i in range(min(a),max(a)+1):
    print(i*interval,(i+1)*interval,':',a.count(i))

输出

0 3 : 2
3 6 : 4
6 9 : 5
9 12 : 1
12 15 : 1
15 18 : 1
18 21 : 0
21 24 : 0
24 27 : 0
27 30 : 1

是否有一种获取此信息的简单方法?越简单越好

3 个答案:

答案 0 :(得分:3)

现在我们在谈论性​​能,我想使用bincount 提供我的 numpy解决方案:

import numpy as np

interval = 3
a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28]
l = max(a) // interval + 1
b = np.bincount(a, minlength=l*interval).reshape((l,interval)).sum(axis=1)

({minlength仅在max(a)不是间隔的倍数时才能够重塑)是必需的

从Erfan的答案中提取标签后,我们得到:

rnge = range(0, max(a) + interval + 1, interval)
lables = [f'[{i}-{j})' for i, j in zip(rnge[:-1], rnge[1:])]

for l,b in zip(lables,b):
    print(l,b)

[0-3) 2
[3-6) 4
[6-9) 5
[9-12) 1
[12-15) 1
[15-18) 1
[18-21) 0
[21-24) 0
[24-27) 0
[27-30) 1

这比熊猫解决方案快得多。

性能和规模比较

为了评估扩展能力,我只替换了a = [1, ..., 28] * n并将定时执行(不导入和打印)定为n = 1、10、100、1K,10K和100K:

enter image description here

(win32上的python 3.7.3 /熊猫0.24.2 / numpy 1.16.2)

答案 1 :(得分:2)

具有pd.cutgroupby的熊猫解决方案

s = pd.Series(a)
bins = pd.cut(s, range(0, s.max() + interval, interval), right=False)
s.groupby(bins).count()
[0, 3)      2
[3, 6)      4
[6, 9)      5
[9, 12)     1
[12, 15)    1
[15, 18)    1
[18, 21)    0
[21, 24)    0
[24, 27)    0
[27, 30)    1
dtype: int64

要获得更清洁的垃圾箱结果,我们可以使用链接的答案中的this方法:

s = pd.Series(a)
rnge = range(0, s.max() + interval, interval)
labels = [f'{i}-{j}' for i, j in zip(rnge[:-1], rnge[1:])]
bins = pd.cut(s, range(0, s.max() + interval, interval), right=False, labels=labels)
s.groupby(bins).count()
0-3      2
3-6      4
6-9      5
9-12     1
12-15    1
15-18    1
18-21    0
21-24    0
24-27    0
27-30    1
dtype: int64

答案 2 :(得分:1)

您可以使用字典理解力在一行中进行操作:

a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28]

{"[{};{}[".format(x, x+3) : len( [y  for y in a if y >= x and y < x+3] ) 
 for x in range(min(a), max(a), 3)}

输出:

{'[1;4[': 3,
 '[4;7[': 4,
 '[7;10[': 5,
 '[10;13[': 1,
 '[13;16[': 0,
 '[16;19[': 1,
 '[19;22[': 0,
 '[22;25[': 0,
 '[25;28[': 0}

  

性能比较:

     

具有pd.cut和groupby的熊猫解决方案: 8.51 ms 每个循环±32 µs(平均±标准偏差,共运行7次,每个循环100次)

     

字典理解: 19.7 µs :每个循环±37.1 ns(平均±标准偏差,共运行7次,每个循环100000次)

     

使用np.bincount: 22.4 每个循环µs±263 ns(平均±标准偏差,共运行7次,每个循环10000次)