Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按以平均值为中心的标准偏差对列值进行分类?_Python_Numpy_Pandas_Dataframe_Vectorization - Fatal编程技术网

Python 按以平均值为中心的标准偏差对列值进行分类?

Python 按以平均值为中心的标准偏差对列值进行分类?,python,numpy,pandas,dataframe,vectorization,Python,Numpy,Pandas,Dataframe,Vectorization,我有一个熊猫数据框,其中有一组按排序的值: 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()的增量递增 有没有办法对大型数据帧进行矢量化 更新(有效的方法在下面的答案中!) 然后使用np.digitalize()将值移动

我有一个熊猫数据框,其中有一组按排序的值:

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()的增量递增

有没有办法对大型数据帧进行矢量化

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

然后使用
np.digitalize()
将值移动到适当的存储箱中


如果你能找到一个更有效的方法,那会很有帮助的

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

edges
获取序列并获得
mu_sig
结果。然后检查序列最小值是否小于标准偏差减去平均值的最小倍数。如果是,则在列表前加上前缀。对max执行相同的检查

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()
然后使用

这是你的答案
默认情况下,这将返回长度为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的系列

长度为1000000的系列


共享你的循环实现?@Divakar,添加了代码示例不确定我是否假设了错误,但代码没有运行,是吗?在:
if x>df.min():
处抛出错误?是的,我意识到这是一个糟糕的代码,然后到控制台进行测试。太差劲了,无法跟上,所以我删除了它,并将在下次有机会时添加到问题中:/对不起@对不起,那是个愚蠢的打字错误。你能看看我提出的最新解决方案,看看是否有意义吗?
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]
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]