Binning Pandas列值是否以标准偏差为中心?

时间:2016-07-21 21:57:17

标签: python numpy pandas dataframe vectorization

我有一个Pandas数据框,其中包含一系列按排序顺序排列的值:

df = pd.DataFrame(np.arange(1,21))

我想最终得到一个像这样的列表/数组:

[0,1.62,4.58,7.54,10.5,13.45,16.4,19.37,20]

第一个和最后一个元素是df.min()df.max(),中心元素是数据框的df.mean(),周围的元素都是0.5*df.std()的增量

有没有办法对大型DataFrame进行矢量化?

更新(有效的方法在下面的答案中!)

a = np.arange(df[0].mean(),df[0].min(),-0.5*df[0].std())
b = np.arange(df[0].mean(),df[0].max(),0.5*df[0].std())
c = np.concatenate((a,b))
c = np.append(c,[df[0].min(),df[0].max()])
c = np.unique(c)

然后使用np.digitize()将值移动到适当的分区。

如果您找到更有效的方法,那将会有所帮助!

1 个答案:

答案 0 :(得分:1)

mu_sig通过将[-2, -1, 0, 1, 2]乘以sigma来计算各种标准偏差。

edges需要一系列内容并获得mu_sig个结果。然后检查系列最小值是否小于标准差的最小倍数减去平均值。如果是,则将其添加到列表中。检查最大值

def edges(s, n=7, rnd=2, sig_mult=1):
    mu = s.mean()
    sig = s.std()
    mn = s.min()
    mx = s.max()

    sig = np.arange(-n // 2, (n + 1) // 2 + 1) * sig * sig_mult
    ms = (mu + sig)

    # Checking if mins and maxs are in range of sigs
    if mn < ms.min():
        ms = np.concatenate([[mn], ms])
    if mx > max(ms):
        ms = np.concatenate([ms, [mx]])

    return ms.round(rnd).tolist()

它适用于一系列,因此我会挤压您的数据框

df = pd.DataFrame(np.arange(1,21))
s = df.squeeze()

然后使用edges

这是你的答案

edges(s, sig_mult=.5, n=5)

[1, 1.63, 4.58, 7.54, 10.5, 13.46, 16.42, 19.37, 20]
edges(s)

[1, -13.16, -7.25, -1.33, 4.58, 10.5, 16.42, 22.33, 28.25, 34.16, 20]

默认返回长度为11的列表。您可以传递n以获取不同的长度列表。

edges(s, n=3)

[1, -1.33, 4.58, 10.5, 16.42, 22.33, 20]

预计您可能希望将其更改为不同的标准偏差倍数,您也可以这样做:

edges(df, n=3, sig_mult=.2)

[1, 8.13, 9.32, 10.5, 11.68, 12.87, 20]

时序

长度为20的系列

enter image description here

系列长度1,000,000

enter image description here