Нерегулярный биннинг p2 python pandas

У меня есть один небольшой дополнительный вопрос о биннинге в python pandas.

У меня есть кадр данных, подобный следующему:

df = 
 variable    test_score
-1           52.0
 1           53.0
 4           54.0
 6           64.0
 6           64.0
-6           64.0
 5           71.0
 10          73.0
-15          75.0
 4           77.0
 ....... etc, etc....

Я хотел бы создать корзину по отношению к столбцу/переменной «переменной», чтобы в каждой «переменной» ячейке отображалось одинаковое количество строк «X» (скажем, 100).

Затем я хотел бы построить график рассеяния центрального значения каждой корзины переменной ((variable_bin_min + variable_bin_max)/2) в зависимости от среднего значения результатов теста для этой корзины переменных.

Я не вижу простого способа сделать это и был бы признателен за любое руководство!


person Sam Gregson    schedule 07.06.2016    source источник
comment
Меня смущает вопрос. Чтобы «бинировать», вам нужна переменная или столбец для сортировки (может быть, несколько). Вы хотите «бин» по отношению к вашей переменной столбца? Можете ли вы быть уверены, что данные будут работать с разделением на равное количество строк, или вы открыты для такой гибкости? Вы хотите рассчитать bin_min и bin_max как минимум и максимум столбца test_score или переменной?   -  person piRSquared    schedule 07.06.2016
comment
Привет PiRSquared! Приносим извинения за любую путаницу... Я действительно ищу bin в отношении переменной/переменной столбца. Бункеры будут иметь нестандартный размер, чтобы обеспечить одинаковое количество строк в каждой корзине (я допускаю гибкость по краям). Значения bin_min и bin_max являются ребрами каждой переменной bin.   -  person Sam Gregson    schedule 07.06.2016
comment
Я уверен, что построение графика будет простым после того, как будет выполнено начальное объединение...   -  person Sam Gregson    schedule 07.06.2016
comment
Я отредактировал первоначальный вопрос, чтобы избежать путаницы.   -  person Sam Gregson    schedule 07.06.2016


Ответы (2)


Это должно получиться. Я сфабриковал данные, так что они не будут похожи на ваши.

import pandas as pd
import numpy as np

np.random.seed([3,1415])
df = pd.DataFrame(dict(variable=np.random.choice(range(20), (1000,)),
                       test_score=np.random.rand(1000,).round(2) * 100))

df_ = df.groupby(pd.qcut(df.variable, len(df) / 100)).agg([np.min, np.max, np.mean])

pd.concat([df_.variable.apply(lambda x: x.loc[['amin', 'amax']].mean(), axis=1),
           df_.test_score['mean']],
          axis=1,
          keys=['bin_center', 'mean_score']).plot.scatter('bin_center', 'mean_score')

введите здесь описание изображения

person piRSquared    schedule 07.06.2016
comment
Большое спасибо, что нашли время, чтобы сделать это! Это сработает :) - person Sam Gregson; 08.06.2016

Для ваших корзин, содержащих 5 элементов, затем pd.cut() для дальнейшего разделения данных:

LL     = df['test_score'].tolist()
bins   = LL[::5]
person Merlin    schedule 07.06.2016