我如何对熊猫系列进行装箱,将每个装箱的箱尺寸设置为最大/最小预设值

问题描述 投票:2回答:3

我有一个pd.float系列浮点数,我想将其分类为n bins,在其中设置每个垃圾箱的垃圾箱大小,以使max / min为预设值(例如1.20)?

该要求意味着垃圾箱的大小不是恒定的。例如:

data = pd.Series(np.arange(1, 11.0))
print(data)

0     1.0
1     2.0
2     3.0
3     4.0
4     5.0
5     6.0
6     7.0
7     8.0
8     9.0
9    10.0
dtype: float64

我希望纸箱尺寸为:

1.00 <= bin 1 < 1.20
1.20 <= bin 2 < 1.20 x 1.20 = 1.44
1.44 <= bin 3 < 1.44 x 1.20 = 1.73
...

谢谢

python pandas series binning
3个回答
0
投票

这里是pd.cut,其中pd.cut可以用填充有bins的数组的np.cumprod进行计算:

np.cumprod

在这种情况下垃圾箱上升到:

1.2

因此,您必须根据实际数据的值范围进行设置


0
投票

这是我认为的最佳方法,因为您正在考虑数组中的data = pd.Series(list(range(11))) import numpy as np n = 20 # set accordingly bins= np.r_[0,np.cumprod(np.full(n, 1.2))] # array([ 0. , 1.2 , 1.44 , 1.728 ... pd.cut(data, bins) 0 NaN 1 (0.0, 1.2] 2 (1.728, 2.074] 3 (2.986, 3.583] 4 (3.583, 4.3] 5 (4.3, 5.16] 6 (5.16, 6.192] 7 (6.192, 7.43] 8 (7.43, 8.916] 9 (8.916, 10.699] 10 (8.916, 10.699] dtype: category np.r_[0,np.cumprod(np.full(20, 1.2))] array([ 0. , 1.2 , 1.44 , 1.728 , 2.0736 , 2.48832 , 2.985984 , 3.5831808 , 4.29981696, 5.15978035, 6.19173642, 7.43008371, 8.91610045, 10.69932054, 12.83918465, 15.40702157, 18.48842589, 22.18611107, 26.62333328, 31.94799994, 38.33759992]) 值。因此,您无需担心要使用什么值,只需使用multiplier或bin的step_size(当然,如果要使用DataFrame):

max

输出:

min

装箱输出:

data = pd.Series(np.arange(1, 11.0))
bins = []
i = min(data)
while i < max(data):
    bins.append(i)
    i = i*1.2
    bins.append(i)
bins = list(set(bins))
bins.sort()
df = pd.cut(data,bins,include_lowest=True)
print(df)

0
投票

感谢大家的所有建议。没有人能像我想的那样做(可能是因为我最初的问题还不够清楚),但是它们确实帮助我弄清楚了该怎么做,所以我决定发表自己的答案(我希望这是我应该做的)我是stackoverflow的活跃成员相对较新...)

我最喜欢@yatu的矢量化建议,因为它可以在较大的数据集上更好地扩展,但是我追求的不仅是自动计算bin的方法,而且还可以找出覆盖数据集所需的bin的最小数量。

这是我提出的算法:

  1. bin大小已定义,因此bin_max_i / bin_min_i为常数:
0       (0.999, 1.2]
1     (1.728, 2.074]
2     (2.986, 3.583]
3       (3.583, 4.3]
4        (4.3, 5.16]
5      (5.16, 6.192]
6      (6.192, 7.43]
7      (7.43, 8.916]
8    (8.916, 10.699]
9    (8.916, 10.699]
  1. 找出所需箱尺寸(bin_ratio)的箱数量:
Categories (13, interval[float64]): [(0.999, 1.2] < (1.2, 1.44] < (1.44, 1.728] < (1.728, 2.074] < ... <
                                     (5.16, 6.192] < (6.192, 7.43] < (7.43, 8.916] <
                                     (8.916, 10.699]]
  1. 为最小的bin设置下边界,以使最小的数据点适合其中:
bin_max_i / bin_min_i = bin_ratio
  1. 创建满足条件的n个非重叠垃圾箱:
data_ratio = data_max / data_min
n_bins = math.ceil( math.log(data_ratio) / math.log(bin_ratio) )
  1. 一旦可以将所有数据集分配到已经创建的仓中,则停止创建其他仓。换句话说,停止一次:
bin_min_0 = data_min

这里是代码段:

bin_min_i+1 = bin_max_i
bin_max_i+1 = bin_min_i+1 * bin_ratio

我现在准备建立数据的直方图:

bin_max_last > data_max
© www.soinside.com 2019 - 2024. All rights reserved.