Мне нужно создать диапазоны из последовательных значений, которые имеют минимальное значение 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", поэтому любой совет будет оценен по достоинству. Заранее спасибо:)