Биннинг, а затем объединение бинов с минимальным количеством наблюдений?

Допустим, я создаю некоторые данные, а затем создаю ячейки разных размеров:

from __future__ import division
x = np.random.rand(1,20)
new, = np.digitize(x,np.arange(1,x.shape[1]+1)/100)
new_series = pd.Series(new)
print(new_series.value_counts())

показывает:

20 17
16 1
4  1
2  1
dtype: int64

В основном я хочу преобразовать базовые данные, если я установлю минимальный порог не менее 2 на бин, так что new_series.value_counts() будет следующим:

20 17
16 3
dtype: int64

person BobbyJohnsonOG    schedule 26.07.2016    source источник
comment
IIUC вы могли бы использовать groupby с filter: df.groupby('some_col').filter(lambda x: len(x) < threshold)   -  person EdChum    schedule 26.07.2016
comment
Можете ли вы предоставить пример вывода и пояснить свой ввод? Предполагая, что x — это ваши данные, а new — ваши ячейки, они не перекрываются, x — это массив десятичных знаков, а new — это массив целых чисел. Является ли new размером корзины? Так где же стартовые границы?   -  person tmthydvnprt    schedule 26.07.2016
comment
Можете ли вы предоставить тривиальный небольшой набор данных с данными и бинами, а затем вручную создать желаемый результат? Спасибо будет самым ясным способом описать то, что вы пытаетесь сделать.   -  person tmthydvnprt    schedule 26.07.2016
comment
@tmthydvnprt отредактировал OP с примером - имеет ли это смысл?   -  person BobbyJohnsonOG    schedule 26.07.2016
comment
@ChristophTerasa опередил меня после того, как вы опубликовали данные. :) надеюсь, что это работает.   -  person tmthydvnprt    schedule 26.07.2016


Ответы (1)


ОТРЕДАКТИРОВАНО:

x = np.random.rand(1,100)
bins = np.arange(1,x.shape[1]+1)/100

new = np.digitize(x,bins)
n = new.copy()[0] # this will hold the the result

threshold = 2

for i in np.unique(n):
    if sum(n == i) <= threshold:
        n[n == i] += 1

n.clip(0, bins.size) # avoid adding beyond the last bin
n = n.reshape(1,-1)

Это может несколько раз увеличить счет, пока ячейка не будет заполнена достаточно.

Вместо использования np.digitize может быть проще использовать np.histogram, потому что он напрямую даст вам подсчеты, так что нам не нужно sum самим.

person Jan Christoph Terasa    schedule 26.07.2016
comment
По какой-то причине, если я использую это в приведенном выше примере, а затем смотрю на value_counts(), изменяя его на pd.Series(), это ничего не меняет. Может быть, я делаю что-то не так. - person BobbyJohnsonOG; 26.07.2016
comment
Нет особой причины для этого (1100) - данные извлекаются из одного столбца кадра данных pandas. - person BobbyJohnsonOG; 26.07.2016
comment
Я попробую ваш обновленный ответ через минуту, спасибо за помощь. - person BobbyJohnsonOG; 26.07.2016
comment
Мех, хотел добавить вопрос в комментарии, удалю из ответа. :D - person Jan Christoph Terasa; 26.07.2016