Python 2.7 - Разделение серии на интервалы с одинаковым количеством элементов (аналогично pandas.cut ()) - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующие серии:

0         79.0
1        220.0
2        185.0
3        199.0
4        226.0
5        141.0
6        341.0
7        151.0
8         57.0
9        313.0
10       273.0
11       113.0
12       328.0

Если я использую pandas.cut() на этом, вот что я получаю:

    series  equal_intvls
0   79.0    (0.979, 306.1]
1   220.0   (0.979, 306.1]
2   185.0   (0.979, 306.1]
3   199.0   (0.979, 306.1]
4   226.0   (0.979, 306.1]
5   141.0   (0.979, 306.1]
6   341.0   (306.1, 608.2]
7   151.0   (0.979, 306.1]
8   57.0    (0.979, 306.1]
9   313.0   (306.1, 608.2]
10  273.0   (0.979, 306.1]
11  113.0   (0.979, 306.1]
12  328.0   (306.1, 608.2]

pandas.cut() дает мне сериюинтервалов, имеющих одинаковую длину (максимальное значение - минимальное значение), длина интервалов равна 2, но от начальной точки на интервалах до конечной точки в каждом интервале есть несколько чисел, которые могут не совпадать для каждогоинтервалов.

Если я использую pandas.cut(), я получаю интервалы одинаковой длины, но как я могу разбить этот ряд на интервалы, которые содержат одинаковое количество элементов в каждом интервале ??

То, что я хотел бы получить, это новый столбец, содержащий эти интервалы с одинаковым количеством элементов в них.Взяв в качестве примера следующий массив:

[1, 7, 7, 4, 6, 3]

я хотел бы получить эту серию интервалов с одинаковым количеством элементов:

[(0.999, 3.667] ,(3.667, 6.333] , (6.333, 7.0]]


(0.999, 3.667] - There are 2 values in this imterval: (1, 3)
(3.667, 6.333] - There are 2 values in this interval (4, 6)
(6.333, 7.0] - And again, 2 values within this interval (7, 7)

Я хотел бы получитьинтервалы в последовательной форме, так что я могу ввести его как новый столбец в исходный файл.

Я пробовал np.split и np.array_split безуспешно, я также посетил некоторые другие сообщения в этомсайт, который похож на то, что я хочу, но не, кажется, действительно подходит для моего случая.Пожалуйста, помогите.

Каков наилучший способ получить такие интервалы ??

Большое спасибо заранее

1 Ответ

0 голосов
/ 09 декабря 2018

Я думаю, что Вы ищете qcut:

>>> >>> pd.qcut(pd.Series([1, 7, 7, 4, 6, 3]),3)
0    (0.999, 3.667]
1      (6.333, 7.0]
2      (6.333, 7.0]
3    (3.667, 6.333]
4    (3.667, 6.333]
5    (0.999, 3.667]
dtype: category
Categories (3, interval[float64]): [(0.999, 3.667] < (3.667, 6.333] < (6.333, 7.0]]
...