#python #pandas #statistics #binning
Вопрос:
Я хочу расположить данные горизонтально в плоскости звездной величины по цвету. Вот как выглядят мои данные (звезды красного гиганта): RGB-звезды в моем образце
Теперь я хочу поместить эти звезды в небольшие ячейки (ячейки = 0,2 или 0,3) горизонтально, т. е. параллельно данной оси X. Число, которое я использую для ячеек, как вы можете видеть, не является целым числом.
Вот что я пробовал до сих пор:
f814w = RGB_stars['col42'] # These are the stars I want to bin
f814w_cut = pd.cut(f814w, bins=0.2) # using pd.cut with bins=0.2
Это дает мне ошибку:
«Ошибка значения: bins
должно быть положительное целое число».
Другим методом, который я попробовал, был df.sample из pandas, но я не думаю, что он работает правильно для выборки данных, с которой я работаю. Результат, который я получаю при использовании этого метода, находится в случайном порядке, поэтому я не смог найти способ убедиться, что разделение было выполнено в небольших ячейках (ячейки = 0,2 или 0,3).
Что я должен сделать, чтобы сгруппировать весь столбец по количеству ячеек Есть ли обходной путь? Заранее спасибо.
Комментарии:
1. Когда вы говорите
bins=0.2
, вы имеете в виду, что хотите, чтобы ширина ячейки была 0,2?2. YYYesss, каждая textbf{ширина ячейки} должна быть 0,2 (в данном случае величины).
Ответ №1:
bins
указывает количество ячеек, которые вы хотите использовать. Следовательно, оно должно быть целым числом. Если посмотреть на ваши данные, то ячейки такого размера 0.2
дадут около 15 ячеек. Вы можете указать это 2 способами:
Я начинаю со случайных значений, которые чем-то похожи на вашу f814w
серию:
>>> import numpy as np
>>> f814w
0 4.5
1 2.4
2 3.6
3 2.1
4 2.6
5 2.5
6 3.1
7 2.7
8 4.9
9 4.0
Name: col42, dtype: float64
Либо вычислите количество ячеек:
>>> bins = np.ceil((f814w.max() - f814w.min()) / .2)
>>> pd.cut(f814w, bins=int(bins))
0 (4.3, 4.5]
1 (2.3, 2.5]
2 (3.5, 3.7]
3 (2.097, 2.3]
4 (2.5, 2.7]
5 (2.3, 2.5]
6 (2.9, 3.1]
7 (2.5, 2.7]
8 (4.7, 4.9]
9 (3.9, 4.1]
Name: col42, dtype: category
Categories (14, interval[float64]): [(2.097, 2.3] < (2.3, 2.5] < (2.5, 2.7] < (2.7, 2.9] < ... <
(4.1, 4.3] < (4.3, 4.5] < (4.5, 4.7] < (4.7, 4.9]]
Или укажите края ячейки (что мне кажется проще):
>>> pd.cut(f814w, bins=np.arange(f814w.min(), f814w.max() .2, .2))
0 (4.3, 4.5]
1 (2.3, 2.5]
2 (3.5, 3.7]
3 NaN
4 (2.5, 2.7]
5 (2.3, 2.5]
6 (2.9, 3.1]
7 (2.5, 2.7]
8 (4.7, 4.9]
9 (3.9, 4.1]
Name: col42, dtype: category
Categories (15, interval[float64]): [(2.1, 2.3] < (2.3, 2.5] < (2.5, 2.7] < (2.7, 2.9] < ... <
(4.3, 4.5] < (4.5, 4.7] < (4.7, 4.9] < (4.9, 5.1]]
Это дает точно такой же результат. Обратите .2
внимание на высокую границу np.arange()
, так как она исключает высокую границу при генерации чисел, точно так же, как range()
. Если вы можете заменить f814w.min()
и f814w.max()
с более теоретическими или, по крайней мере, оценочными границами, то второй вариант (указание ячеек) работает лучше:
>>> pd.cut(f814w, bins=np.arange(2, 5.2, .2))
0 (4.4, 4.6]
1 (2.2, 2.4]
2 (3.4, 3.6]
3 (2.0, 2.2]
4 (2.4, 2.6]
5 (2.4, 2.6]
6 (3.0, 3.2]
7 (2.6, 2.8]
8 (4.8, 5.0]
9 (3.8, 4.0]
Name: col42, dtype: category
Categories (15, interval[float64]): [(2.0, 2.2] < (2.2, 2.4] < (2.4, 2.6] < (2.6, 2.8] < ... <
(4.2, 4.4] < (4.4, 4.6] < (4.6, 4.8] < (4.8, 5.0]]
Комментарии:
1. Спасибо, @Cimbali, теперь у меня есть следующий вопрос. Я использовал второй метод в своем фрейме данных, и я получаю повторяющиеся значения, подобные этому: 0 (15.644, 15.844] 1 (16.444, 16.644]. # Это 2 (16.844, 17.044]. # Это и строка ниже 3 (16.844, 17.044] 4 (17.044, 17.244] … Имя: col42, Длина: 129, тип файла: категория Категории (24, интервал[float64]): [(15.444, 15.644] < (15.644, 15.844] < (15.844, 16.044] .. (19.444, 19.644] < (19.644, 19.844] < (19.844, 20.044] Спасибо!
2. Кроме того, я хочу, чтобы ширина каждого бункера была размером 0,2 (величины). Но pd.cut() дает мне разницу между двумя последовательными точками данных в 0,2.
3. @ShalmaleeKapse привязка принимает значения и присваивает их ячейкам, поэтому ячейки действительно могут повторяться, если у вас есть несколько точек с одинаковым интервалом 0,2. Я не уверен, что понимаю ваш второй пункт, но попробуйте отредактировать его в своем вопросе