сбивающий с толку результат из pd.cut - PullRequest
1 голос
/ 07 июня 2019

Мне нужно создать диапазоны из последовательных значений, которые имеют минимальное значение 0 и максимальное значение 1990161.

Я думал создать 5 диапазонов одинаковой длины, поэтому применил «pd.cut» и получил этот результат.

pd.cut(df['v'], 5)
----------------------------------------------
[(-1990.161, 398032.2], (796064.4, 1194096.6], (398032.2, 796064.4], (1194096.6, 1592128.8], (1592128.8, 1990161.0]]
Categories (5, interval[float64]): [(-1990.161, 398032.2] < (398032.2, 796064.4] < (796064.4, 1194096.6] < (1194096.6, 1592128.8] < (1592128.8, 1990161.0]]

я ожидал, что "pd.cut" создаст диапазон из фактических значений, поэтому самый низкий диапазон должен был начинаться с 0. Но это был -1990,161.

Я искал несколько кодов и попробовал это.

lower, higher = df['v'].min(), df['v'].max()
n_bins= 5
edges = range(lower, higher+5, int(round((higher - lower)/n_bins,0)))
lbs = ['(%d, %d]'%(edges[i], edges[i+1]) for i in range(len(edges)-1)]
pd.cut(df['v'], bins=n_bins, labels=lbs, include_lowest=True)
----------------------------------------------
Categories (5, object): [(0, 398032] < (398032, 796064] < (796064, 1194096] < (1194096, 1592128] < (1592128, 1990160]]

Я думаю, что было две проблемы .. во-первых, эти метки не кажутся правильными ... те метки (0,398032] и (1592128, 1990160], к которым относятся min (0) и max (1990161), говорят, что они не включают 0, 1990161, но те значения включены.

во-вторых, коды выше только что добавленных меток не регулируют границу диапазона. Это означает, что результаты имеют тот же диапазон, что и первый код.

Причина, по которой я использовал "pd.cut", заключалась в том, что он автоматически вычислял ту же длину из диапазона значений.

Есть ли другой способ настроить границу диапазона, кроме применения бинов типа [0, 3000, 5000 ...] путем создания списка?

Может быть, я неправильно понял логику или результат "pd.cut", поэтому любой совет будет оценен по достоинству. Заранее спасибо:)

1 Ответ

0 голосов
/ 07 июня 2019

Обычно мы должны вычесть и добавить бункеры к min и max

binsize=df.v.ptp()//5
pd.cut(df['v'], bins=range(df.v.min()-binsize//5,df.v.max()+binsize,binsize), include_lowest=True)
...