使用 bins=0.2分数水平对 Pandas 数据框进行装箱,我应该怎么做?

问题描述

我想在恒星的颜色-星等平面中水平合并数据。这是我的数据(红巨星)的样子: RGB stars in my sample

现在,我想将这些星星水平地放入小箱中(箱 = 0.2 或 0.3),即平行于给定的 X 轴。如您所见,我用于 bin 的数字不是整数。

这是我目前尝试过的:

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

这给了我一个错误

"ValueError: bins 应该是一个正整数。"

我尝试的另一种方法是来自 pandas 的 df.sample,但我认为它对我正在使用的数据样本不能正常工作。我使用这种方法时获得的输出随机顺序的,所以我找不到一种方法来确定拆分是在小 bin 中完成的(bins = 0.2 或 0.3)。

我应该怎么做才能将整列的 bins 数

解决方法

bins 指定要使用的 bin 数量。因此它必须是一个整数。查看您的数据,大小为 0.2 的 bin 将提供大约 15 个 bin。您可以通过两种方式指定:

我从有点像您的 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

要么计算 bin 的数量:

>>> 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]]

或者指定 bin 边缘(我觉得更容易):

>>> 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,dtype: category
Categories (15,interval[float64]): [(2.1,2.9] < ... <
                                     (4.3,4.9] < (4.9,5.1]]

这给出了完全相同的结果。请注意 + .2 的上限上的 np.arange(),因为它在生成数字时排除了上限,就像 range() 一样。如果您可以将 f814w.min()f814w.max() 替换为更多理论或至少估计的界限,那么第二个选项(指定 bin)效果更好:

>>> 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,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]]