簡體   English   中英

Python:檢查值屬於哪個bin

[英]Python: Checking to which bin a value belongs

我有一個值列表和bin邊緣列表。 現在我需要檢查它們屬於哪個bin的所有值。 是否有更多的pythonic方式,而不是迭代值,然后遍歷bin並檢查值是否屬於當前bin,如:

my_list = [3,2,56,4,32,4,7,88,4,3,4]
bins = [0,20,40,60,80,100]

for i in my_list:
    for j in range(len(bins)):
        if bins(j) < i < bins(j+1):
            DO SOMETHING

這對我來說看起來不太漂亮。 謝謝!

可能為時已晚,但為了將來的參考,numpy有一個功能就是這樣:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

>>> my_list = [3,2,56,4,32,4,7,88,4,3,4]
>>> bins = [0,20,40,60,80,100]
>>> np.digitize(my_list,bins)
array([1, 1, 3, 1, 2, 1, 1, 5, 1, 1, 1])

結果是一個索引數組,對應於來自bin的bin,來自my_list的每個元素也屬於bin。 請注意,該函數還會將值放在第一個和最后一個bin邊緣之外:

>>> my_list = [-5,200]
>>> np.digitize(my_list,bins)
array([0, 6])

而熊貓也有類似的東西:

http://pandas.pydata.org/pandas-docs/dev/basics.html#discretization-and-quantiling

>>> pd.cut(my_list, bins)
Categorical: 
array(['(0, 20]', '(0, 20]', '(40, 60]', '(0, 20]', '(20, 40]', '(0, 20]',
       '(0, 20]', '(80, 100]', '(0, 20]', '(0, 20]', '(0, 20]'], dtype=object)
Levels (5): Index(['(0, 20]', '(20, 40]', '(40, 60]', '(60, 80]',
                   '(80, 100]'], dtype=object)

也許這有助於您走上正軌:

>>> import itertools
>>> my_list = [3,2,56,4,32,4,7,88,4,3,4]
>>> for k, g in itertools.groupby(sorted(my_list), lambda x: x // 20 * 20):
...     print k, list(g)
... 
0 [2, 3, 3, 4, 4, 4, 4, 7]
20 [32]
40 [56]
80 [88]

首先,當值等於bin邊界時,代碼將失敗 -

更改

if bins(j) < i < bins(j+1):

在某處有一個<=符號。

之后,使用bisect模塊

import bisect
bisect.bisect(x, bins)

bisect.bisect_right

取決於當值位於bin邊界時是否更喜歡使用較高或較低的bin。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM